3.2 低级绘图函数
R还可以通过函数在现有图形的基础上增加一些额外的内容,如添加标题、绘制坐标轴、在特定的位置增加图形(如辅助线,拟合线)或文字等。这些函数在R中称为低级作图命令(low-level plotting command)。
3.2.1 标题
除了图形参数,许多高级函数(如plot、barplot、boxplot、qqnorm)也允许自行设定坐标轴和文本选项。以下代码在图形上添加了主标题(main)、副标题(sub)、坐标轴标签(xlab、ylab),结果如图3-9所示。
> attach(iris)
> boxplot(Sepal.Length~Species,col=heat.colors(3),
+ main=list("Sepal.Length按照Species分类的箱线图",
+ font=4,col="red",cex=1.5),
+ sub=list("数据来源:iris数据集",font=3,
+ col="green",cex=0.8),
+ xlab="Species",ylab="Sepal.Length")
数据来源:ins数据集
可以使用title()函数为图形添加标题和坐标轴标签。调用格式为:
title(main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
line = NA, outer = FALSE, ...)
title常用参数说明如表3-4所示。
执行以下代码可以得到与图3-9相同效果的箱线图。
> boxplot(Sepal.Length~Species,col=heat.colors(3))
> title(main=list("Sepal.Length按照Species分类的箱线图",
+ font=4,col="red",cex=1.5),
+ sub=list("数据来源:iris数据集",font=3,
+ col="green",cex=0.8),
+ xlab="Species",ylab="Sepal.Length")
由上可见,对标题的多个参数赋值时,其赋值形式是以list形式承载的。也可以先使用main="主标题",设置主标题内容,再通过font.mian、col.main、cex.main设置主标题文字的样式、颜色和大小。执行以下代码可得到与图3-9相同效果的箱线图。
> boxplot(Sepal.Length~Species,col=heat.colors(3))
> title(main="Sepal.Length按照Species分类的箱线图",
+ font.main=4,col.main="red",cex.main=1.5,
+ sub="数据来源:iris数据集",font.sub=3,
+ col.sub="green",cex.sub=0.8,
+ xlab="Species",ylab="Sepal.Length")
3.2.2 坐标轴
在高级绘图函数中一般都有用于设置坐标轴展示和范围的axes、xlim和ylim参数。其中axes是逻辑参数,axes=TRUE(默认)时,显示x轴和y轴,axes=FALSE时,隐藏x轴和y轴;参数xaxt="n"和yaxt="n"分别隐藏x轴或y轴;xlim、ylim参数设置x轴、y轴范围。
低级绘图函数axis( )可以在上、下、左、右4个边上设置坐标轴,并设置坐标轴的范围/刻度标记等。其调用形式为:
axis(side, at = NULL, labels = TRUE, tick = TRUE, line = NA,
pos = NA, outer = FALSE, font = NA, lty = "solid",
lwd = 1, lwd.ticks = lwd, col = NULL, col.ticks = NULL,
hadj = NA, padj = NA, ...)
主要参数如表3-5所示。
利用高级绘图函数boxplot对iris数据集绘制箱线图,将参数axes设置为FALSE隐藏x轴和y轴,然后利用低级绘图函数axis详细设置x轴和y轴。执行以下代码得到的结果如图3-10所示。
> #加载iris数据到内存
> attach(iris)
> #绘制箱线图
> boxplot(Sepal.Length~Species,col=heat.colors(3),
+ axes=FALSE,xlab="Species",ylab="Sepal.Length")
> #设置X轴样式
> axis(side=1,at=1:3,labels=unique(Species),col.axis="red",tick=FALSE)
> #设置Y轴样式
> axis(side=2,col.ticks = "gold",font = 3,col = "blue")
side=1表示设置x轴,col.axis="red"b表示将x轴刻度标记颜色设置为红色,tick=FALSE表示不显示坐标轴;side=2表示设置y轴,font = 3表示y轴字体是斜体,col = "blue"表示y轴线条是蓝色,col.ticks = "gold"表示将刻度颜色设置为金色。
3.2.3 图例
当图形中包含的数据不止一组时,通常会使用不同的颜色来区分,并且使用图例说明不同颜色代表的组别。图例中既包含文字,也包含点和线元素。可以利用legend函数来设置图例参数。
legend函数的常用参数如表3-6所示。
下面看看对1940年弗吉尼亚州的死亡率作图的一个例子。执行以下代码得到的结果如图3-11所示。
> #绘制分组柱状图
> barplot(VADeaths,beside = TRUE,col=cm.colors(5))
> # 添加图例
> legend("top",legend=rownames(VADeaths),
+ ncol=5,fill=cm.colors(5),bty="n")
将图例摆放在top位置,图例内容为VADeaths数据集的行名称,图例列数设置为5,每个图例标签的颜色设置为与柱子对应的类别颜色相同,最后不要图例边框。
3.2.4 网格线
使用grid()函数可以在绘图的基础上添加网格线,其参数主要包括:ny用于设置水平网格的数目;nx用于设置垂直网格的数据,设置为NA时,表示不绘制相应的网格线;lwd、lty和col参数分别设置网格线的宽度、样式和颜色。
继续以VADeaths为例,执行以下代码得到的结果如图3-12所示。
> op <- par(mfcol=1:2)
> barplot(VADeaths,beside = TRUE,col=cm.colors(5),
+ main="plot VADeaths with grid()")
> grid()
> barplot(VADeaths,beside = TRUE,col=cm.colors(5),
+ main="plot VADeaths with grid(NA,7,lty=2,lwd=1.5,col='green')")
> grid(NA,7,lty=2,lwd=1.5,col="green")
> par(op)
左图使用grid()默认参数,同时绘制水平和垂直的网格线,颜色默认是深灰色,线型是点线;右图不绘制垂直网格线(nx=NA),绘制6条水平网格线(ny=7),线型为虚线,粗细为默认的1.5倍,颜色为绿色。
3.2.5 点
通过低级绘图函数points可以在图上绘制点:
points(x, y = NULL, type = "p", ...)
使用这个函数可以很方便地在已有的图上加点。参数x是横坐标位置,参数y是纵坐标位置,可以设置向量来代表多个点的位置。参数type有9种取值,分别代表不同的样式:"p"表示画点(默认);"l"表示画线;"b"表示同时画点和线,但点线不相交;"c"表示将type="b"中的点去掉,只剩下相应的线条部分;"o"表示同时画点和线,且相互重叠(这是与type="b"的区别);"h"表示画铅垂线;"s"表示画阶梯线,从一点到下一点时,先画水平线,再画垂直线,"S"也是画阶梯线,但从一点到下一点是先画垂直线,再画水平线;"n"表示做一幅空图。大部分plot函数的参数都适用于points。最常用的参数是col(设置点的颜色)、bg(设置点的背景色)、pch(设置所绘制的符号)、cex(设置点的大小)和lwd(设置符号边框线条的宽度)。
创建一个数据对象data,其中100个数据服从mean为0,sd为1的正态分布,另外3个点服从mean为4,sd为1的正态分布。接下来对data绘制箱线图,并利用points函数将异常值用黄色点标记出来。执行如下代码得到的结果如图3-13所示。
> set.seed(1234)
> data <- c(rnorm(100,mean=0,sd=1),rnorm(3,mean=4,sd=1)) #创建数据对象data
> boxplot(data,col="violet",ylim=c(-4,5),outline=F) #绘制箱线图
> points(rep(1,3),data[101:103],pch=21,bg="yellow",cex=1.2) #标识异常值
3.2.6 文字
可以用text函数为图形添加文字。其调用形式为:
text(x, y = NULL, labels = seq_along(x), adj = NULL,
pos = NULL, offset = 0.5, vfont = NULL,
cex = 1, col = NULL, font = NULL, ...)
其参数描述如表3-7所示。
如果想将图3-13中的异常值用“异常值”文字标明。只需要增加如下代码即可,结果如图3-14所示。
> text(rep(1,3),data[101:103],pos=4,label=paste0("异常值",data[101:103]))#pos=4表示在右侧
3.2.7 线
- lines函数绘制曲线
lines函数可以在已有图形中添加曲线,使用格式为lines(x, y = NULL, type = "l", ...)。plot函数的很多参数也可用于lines。一些比较有用的参数包括lty(线条类型)、lwd(线条宽度)、col(线条颜色)等。
由于绘制散点图的高级绘图函数plot并没有add参数,即在同一绘图窗口中不能使用两个plot函数,此时可以使用lines函数。
以ggplot2包自带的美国经济数据economics为例,先利用plot函数绘制个人储蓄率随时间变化的时序图,再利用lines在图上增加一周内平均失业持续时间的曲线。执行如下代码得到的结果如图3-15所示。
> data(economics, package = "ggplot2")
> attach(economics) #将economics加载到内存
> plot(date,psavert,type="l",ylab="",ylim=c(0,26)) #绘制psavert随时间变化的时序图
> lines(date,uempmed,type="l",col="blue") #绘制uempmed曲线,并设置为蓝色
> detach(economics) #将economics从内存中移除
- abline函数绘制直线
使用abline函数可以在已有图形中添加参考直线。abline函数的基本形式是:
abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,
coef = NULL, untf = FALSE, ...)
abline函数的参数如表3-8所示。
执行以下代码,将在散点图上增加一条线性拟合直线。绘制的结果如图3-16所示。
> attach(iris)
> # 绘制一幅简单的散点图
> plot(Petal.Length~Petal.Width)
> # 绘制Petal.Length变量均值的水平线
> abline(h=mean(Petal.Length),col="gray60")
> # 绘制Petal.Width变量均值的竖直线
> abline(v=mean(Petal.Width),col="gray60")
> # 绘制拟合直线
> abline(lm(Petal.Length~Petal.Width),
+ col="red",lwd=2,lty=3)
> detach(iris)