本系列是一个新的系列,在此系列中,我将和你们共同窗习R语言。因为我对R语言的了解也甚少,因此本系列更多以一个学习者的视角来完成。windows
参考教材:《R语言实战》第二版(Robert I.Kabacoff),书中所提到的John Cook的优秀博文,关于代码规范的《来自Google的R语言编码风格指南》。ide
plot()
是R中为对象做图的一个泛型函数,它的输出由所绘制对象的类型不一样而不一样。若是x
和y
是两个等长的数字向量,则如下代码将绘制点集\((x,y)\),并用线段将其链接。函数
plot(x, y, type="b")
这里type="b"
表明同时绘制点和线。还有如下的几种type
属性的选择:学习
"p"
:只绘制点,不绘制线段。"l"
:只绘制线段,不绘制点。"b"
:绘制点和线,但实线不经过点。"o"
:绘制点和线,且实线会经过点,与"b"
的视觉效果不一样。"h"
:只绘制各点到\(x\)轴的竖线,不绘制点和线。"s"
:绘制阶梯型曲线。"S"
:绘制阶梯型区间,可是阶梯方向不一样。"n"
:不绘制任何点、线。在使用plot()
做图以前,可使用par()
函数修改图形的参数,这个函数能够任意次调用。在使用par()
修改图形参数以前,每每会加入如下两句:字体
opar <- par(no.readonly=TRUE) ... par(opar)
当调用par(opar)
后,将还原默认参数环境。编码
如下是用于指定符号和线条类型的参数:spa
pch
:指定绘制点时使用的符号,范围是\(\{0,1,\cdots,25\}\)。cex
:指定符号的大小,表示绘图符号相对于默认大小的缩放倍数,默认值是1。lty
:指定线条类型,范围是\(\{1,2,\cdots,6\}\)。lwd
:指定线条宽度,表示之于默认值的相对粗细,默认值是1。也能够直接在plot
处加上这四个参数:代码规范
plot(x, y, type="b", pch=11, lty=2, cex=2, lwd=2)
如下是用于指定颜色的参数:code
col
:默认的绘图颜色,能够传入一个向量并循环使用。col.axis
:坐标轴刻度文字的颜色。col.lab
:坐标轴标签文字的颜色。col.main
:标题颜色。col.sub
:副标题颜色。fg
:图形前景色,如坐标轴线。bg
:图形背景色。颜色的指定,能够用颜色下标、颜色名字、十六进制颜色值、RGB值、HSV值来指定,函数colors()
能够返回全部可用颜色的名称(657种)。对象
能够用rainbow(n)
建立一个\(n\)种连续的彩虹形颜色列表,能够用gray(vector)
来得到一个灰度色列表,经常使用的vector=0:n/n
,是一个\([0,1]\)之间的均匀列表。
RColorBrewer
是一个用于建立颜色的经常使用包,其中brewer.pal(n, name)
能够从调色盘name
中建立一个颜色值的向量,如下程序段是一个brewer.par()
函数的使用示例。
library(RColorBrewer) n <- 9 mycolor <- brewer.pal(n, "Set1") # 使用的颜色集合是"Set1" barplot(rep(1,n), col = mycolor)
可使用display.brewer.all()
显示全部调色板的颜色,或者display.brewer.pal(name)
显示某个调色板的颜色。brewer.pal.info
命令能够给出全部调色板的列表。
字体族和字样经过如下参数进行控制。
cex
:相对默认大小的缩放倍数,默认值是1(表明如下一类,不要直接调用)。cex.axis
:坐标轴刻度文字的缩放倍数。cex.lab
:坐标轴标签的缩放倍数。cex.main
:标题的缩放倍数。cex.sub
:副标题的缩放倍数。font
:整数,指定字体样式。\(\{1,2,3,4,5\}\)分别表明常规、粗体、斜体、粗斜体、符号字体(表明如下一类,不要直接调用)。font.axis
:坐标轴刻度文字的字体样式。font.lab
:坐标轴标签的字体样式。font.main
:标题的字体样式。font.sub
:副标题的字体样式。ps
:字体磅值,文本的最终大小为ps*cex
。family
:绘制文本时使用的字体族,标准取值为serif
(衬线)、sans
(无衬线)、mono
(等宽)。字体族的设置稍显复杂,在Windows系统中,mono
映射为TT Courier New,sarif
映射为TT Times New Roman,sans
映射为TT Arial,这里TT指True Type。若是想要使用其余字体,须要建立新的映射,使用windowsFonts()
和windowsFont()
来建立。
x <- c(20, 30, 40, 45, 60) y <- c(16, 20, 27, 40, 60) windowsFonts( A=windowsFont("Arial Black"), B=windowsFont("Bookman Old Style"), C=windowsFont("Comic Sans MS") ) par(pch=17, lty=6, cex=2, lwd=3) # 注意cex参数也会对文本产生影响 par(col='red') par(font.main=4, family="C", ps=6) plot(x, y, type="b", main="A Simple Try")
控制图形尺寸和边界大小的参数为:
pin
:以英寸表示的图形尺寸,是一个二元列表(宽和高)。mai
:以数值向量表示的边界大小,单位为英寸(下、左、上、右)。mar
:以数值向量表示的边界大小,单位为英分(下、左、上、右)。添加标题和坐标轴标签:使用title()
函数,其调用格式为
title(main="main title", sub="subtitle", xlab="x-axis label", ylab="y-axis label")
能够在title()
函数中添加其余图形参数,如col.main
、col.lab
、cex.lab
等。
若是要添加个性化的坐标轴,一般要在plot()
函数中设置一些图形参数:
ann
:取FALSE
时,将不会画出标题,包括主标题和副标题。bty
:设置边框样式,默认为"o"
表示所有画出,还有"l"
(左下)、"7"
(右上)、"c"
(上下左)、"u"
(左下右)、"]"
(上下右)、"n"
(无)。xaxs
和yaxs
:设置\(x, y\)轴的范围,默认为"r"
表示比范围略大,"i"
表示和给定做图范围彻底相同。xaxt
和yaxt
:能够取"n"
,此时坐标轴、刻度线和刻度值将不会画出。axes
:若是取FALSE
,则全部坐标轴和框线都不会被画出。添加自定义的坐标轴:使用axis()
函数,其调用格式为
axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)
各个参数的释义为
side
:\(\{1,2,3,4\}\),表示在图形的哪一边绘制坐标轴(下、左、上、右)。at
:数值型向量,表示须要绘制刻度线的位置。labels
:字符型向量,刻度线旁的文字标签,若是缺省则直接使用at
中的值。pos
:坐标轴线绘制位置的坐标。lty
:线条类型。col
:线条和刻度线颜色。las
:标签平行于坐标轴=0
,垂直于坐标轴=2
。tck
:刻度线的长度,以相对于绘图区域大小的分数表示,默认为-0.01,负值表示在图形外侧。x <- c(20, 30, 40, 45, 60) y <- c(16, 20, 27, 40, 60) windowsFonts( A=windowsFont("Arial Black"), B=windowsFont("Bookman Old Style"), C=windowsFont("Comic Sans MS") ) par(pch=17, lty=6, cex=1, lwd=3) par(col='red') par(font.main=2, family="C", ps=12) plot(x, y, type="b", main="A Simple Try", yaxt="n") z <- c(20, 21, 22, 23, 24, 26, 28, 30, 35, 42, 50, 60) axis(4, at=z, labels=z, col.axis='blue', pos=50, las=2, lty=2, tck=-0.02, )
要添加参考线,应当使用abline()
函数,其使用格式为
abline(h=yvalues, v=xvalues)
这里h
表明添加水平参考线的高度位置,v
表明添加垂直参考线的水平位置。能够在其中添加其余图形参数。
要添加图例,应当使用legend()
函数,其使用格式为
legend(location, title, legend, ...)
location
:指定图例的位置,能够给定图例左上角的\(x,y\)坐标,也可使用locator(1)
用鼠标点击,还可使用bottom, bottomleft, left, topleft, top, topright, right, bottomright, center
等关键字。title
:图例标题的字符串。legend
:图例标签组成的字符型向量。如下给出书上的案例:
rm(list=ls()) dose <- c(20, 30, 40, 45, 60) drugA <- c(16, 20, 27, 40, 60) drugB <- c(15, 18, 25, 31, 40) opar <- par(no.readonly = T) par(lwd=2, cex=1.5, font.lab=2) plot(dose, drugA, type="b", pch=15, lty=1, col="red", ylim=c(0,60), main="Drug A vs. Drug B", xlab="Drug Dosage", ylab="Drug Response") lines(dose, drugB, type="b", pch=17, lty=2, col="blue") abline(h=30, lwd=1.5, lty=2, col="gray") library(Hmisc) minor.tick(nx=3, ny=3, tick.ratio=0.5) # 添加次要刻度线 legend("topleft", inset=0.05, title="Drug Type", c("A", "B"), lty=c(1, 2), pch=c(15, 17), col=c("red", "blue")) par(opar)
文本添加能够经过函数函数text()
,向图形内部(一般是各个点)添加文本,使用格式为
text(location, "text to place", pos, ...)
location
:文本的位置参数,能够是一对\((x, y)\)坐标,也能够经过location=locator(1)
用鼠标来肯定摆放位置。pos
:文本相对于位置参数的方位,\(\{1,2,3,4\}\)表明下、左、上、右。还能够追加指定参数offset
做为偏移量。还能够经过mtext()
向图形的四个边界之一添加文本,使用格式为
mtext("text to place", side, line=n, ...)
side
:指定摆放文本的边,\(\{1,2,3,4\}\)表明下、左、上、右。line
:内移或外移文本,值越大,文本外移的程度越大。adj
:文本能够向左下对齐=0
,或向右上对齐=1
。规则排布:可使用par()
函数中的图形参数mfrow=c(nrows, ncols)
来建立按行填充的、行数为nrows
、列数为ncols
的图形矩阵。如下案例书上的实例代码,数据集为R语言内置的mtcars
。
rm(list=ls()) opar <- par(no.readonly = T) par(mfrow=c(2, 2)) # 将绘图区域分红四块 attach(mtcars) plot(wt, mpg, main="Scatterplot of wt vs. mpg") # 第一个图 plot(wt, disp, main="Scatterplot of wt vs. disp") # 第二个图 hist(wt, main="Histogram of wt") # 第三个图 boxplot(wt, main="Boxplot of wt") # 第四个图 detach(mtcars) par(opar)
复杂排布:可使用layout(matrix)
函数来组合图形,这里matrix
给定了图形的所在位置,如
就表明第一幅图位于第一行的一、2列,第二幅图位于第二行第一列,第三幅图位于第二行第二列。
rm(list=ls()) opar <- par(no.readonly = T) attach(mtcars) mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T) layout(mat) # 按照mat矩阵给出划分 hist(wt, main = "Graph_1") hist(mpg, main = "Graph_2") hist(disp, main = "Graph_3") detach(mtcars) par(opar)
为了精细控制每幅图形的相对大小,能够在layout()
函数中使用widths
和heights
两个参数,它们分别是各列宽度值构成的向量与各行宽度值构成的向量。如今,在上述代码中加入这两个参数。
rm(list=ls()) opar <- par(no.readonly = T) attach(mtcars) mat <- matrix(c(1, 1, 2, 3), nrow=2, ncol=2, byrow=T) layout(mat, widths = c(3, 1), heights = c(1, 1.5)) # 按照mat矩阵给出划分 hist(wt, main = "Graph_1") hist(mpg, main = "Graph_2") hist(disp, main = "Graph_3") detach(mtcars) par(opar)
精细控制:可使用par()
函数的参数fig
来精细控制,它接受四个\([0,1]\)之间的数,分别表明图形在窗口内所占有矩形的四个端点。通常还要加入new=TRUE
,使得新加入的图形与原图形位于一样的画布中。
注意,若是遇到Error in plot.new(): figure margins too large
,则应当修改参数,这是由于因为设备的缘由,子图所需的大小与设置的参数冲突了。