统计分析与可视化是R语言最强的两个点。本节简要介绍一些R基础绘图中的参数。
R图形可设置的参数很多,大概可以分为以下几大部分:
- 图像的保存。不同类型的保存大致步骤相同,如保存为pdf文件
pdf(filename);plot(画图过程);dev.off()
,当然也可以通过rstudio里面的选项直接导出图片; - 图像的全局参数设置。 图形的参数如线条、性状、坐标轴等都可以通过函数
par()
设置,如opar<-par(no.readonly=TRUE);par(lty=2);plot(画图过程);par(opar)
,参数no.readonly=TRUE
可以生成一个可以修改的当前图形参数列表。。当然这些参数除了在全局函数par()
中进行设置,也可以在绘图过程中进行设置。图形参数主要包括:符号、线条、颜色、文本参数、图形尺寸及边界等; - 添加文本,自定义坐标轴和图例。标题和坐标轴名称主要通过
title()
函数进行设置,坐标轴细节(如范围、颜色、标签等)主要通过axis()
函数进行设置,次坐标轴可通过Hmisc包进行设置,图例可通过legend
进行设置; - 文本标注。添加文本主要是通过
text()
和mtext()
函数进行设置,数学标注可使用plotmath()
; - 图形组合。图形组合有三种设置方式:(1)
par()
函数通过设置mfrow
或mfcol
将画布进行分割;(2)layout()
函数也可以对画布进行分割;(3)若需要更为精细的对图形布局进行控制,则需要使用到par()
中的fig
参数。
下面详细的介绍这些参数。
1、图形参数
1.1 符号和线条
参数 | 描述 |
---|---|
pch | 点的符号 |
cex | 指定符号大小,表示与默认的相对大小,如1.5表示为默认的1.5倍 |
lty | 线条类型 |
lwd | 线条宽度,同样以默认值的相对大小来表示,如2表示为默认大小的2倍 |
pch
符号代码如下图:
lty
可指定的线条类型如下:
1.2 颜色
在R中可以通过颜色名称、RGB、颜色值等多种方式来指定颜色。函数colors可返回所有可用颜色名称。此外,rainbow()
、heat.colors()
等多种函数可以指定连续颜色。用于指定颜色的参数如下表:
参数 | 描述 |
---|---|
col | 默认的绘图颜色 |
col.axis | 坐标轴刻度文字(标签)的颜色 |
col.lab | 坐标轴名称的颜色 |
col.main | 主标题的名称 |
col.sub | 副标题的名称 |
fg | 前景色 |
bg | 背景色 |
1.3 文本属性
文本属性主要包括字体大小、样式等。指定文本大小参数如下表所示:
参数 | 描述 |
---|---|
cex | 相对于默认的放大缩小倍数 |
cex.axis | 坐标轴刻度的放大缩小倍数 |
cex.lab | 坐标轴名称放大缩小倍数 |
cex.main | 图片标题放大缩小倍数 |
cex.sub | 图片副标题放大缩小倍数 |
指定文字样式的参数,如par(font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)
:
参数 | 描述 |
---|---|
font | 指定字体样式,1=常规,2=粗体,3=斜体,4=粗斜体,5=符号字体(以Adobe 符号编码表示) |
font.axis | 坐标刻度标签的字体样式 |
font.lab | 坐标轴名称的字体样式 |
font.main | 标题的样式 |
font.sub | 副标题的样式 |
ps | 字体磅值,最终大小为ps*cex |
family | 绘制文本时使用的字体族。标准的取值为serif(衬线)、sans(无衬线)和mono(等宽) |
1.4 图形尺寸与边界
使用下面的参数可以控制图形尺寸和边界大小,如par(pin=c(4, 3), mai=c(1, 0.5, 1, 0.2))
:
参数 | 描述 |
---|---|
pin | 以英寸表示图形的图形尺寸 |
mai | 以数值向量表示的边界大小,顺序为下左右上,单位为英寸 |
mar | 以数值向量表示边界大小,顺序为下左上右,单位为英分。默认值为c(5,4,4,2)+0.1 |
2、添加文本、自定义坐标轴和图例
许多高级函数(如plot、hist、boxplot等)包含了默认的设置标题和坐标轴标签,若想另行设置需在高级函数或par()
中设置anno=FALSE
来移除他们。
2.1 标题
使用title()
函数可以对主标题、副标题、坐标轴标题进行设置,包括标题文本颜色大小等。如:
title(main='my title', sub='my subtitle', xlab='my xlab', ylab='my ylab', col.lab='blue', cex.lab=0.75)
2.2 坐标轴
使用axis()
来创建自定义的坐标轴,而非R的默认坐标轴,格式为: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表示禁用刻度, 1表示绘制网格线);默认值为-0.01 |
需要注意的是,创建自定义坐标轴时,应当禁用高级绘图函数自动生成的坐标轴。参数axes=FALSE
将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。参数xaxt="n"
和yaxt="n"
将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。
若需要绘制次要刻度线,则需要用到Hmisc包的minor.tick()
函数。
2.3 参考线
函数abline()
可以用来为图形添加参考线。
###在y=1,2,3处设置水平参考线
abline(h=c(1,2,3))
###在x=1,2,3处设置竖直参考线
abline(v=c(1,2,3), lty=2, col=''blue)
2.4 图例
使用legend可以为我们的图形添加图例,legend(location, title, legend)
.
参数 | 描述 |
---|---|
location | 有许多方式可以指定图例的位置。你可以直接给定图例左上角的x、 y坐标,也可以执行locator(1),然后通过鼠标单击给出图例的位置,还可以使用关键字bottom、 bottomleft、left、 topleft、 top、 topright、 right、 bottomright或center放置图例。如果你使用了以上某个关键字,那么可以同时使用参数inset=指定图例向图形内侧移动的大小(以绘图区域大小的分数表示) |
title | 图例标题(可选) |
legend | 图例标签组成的字符型向量 |
... | 其他选项。如果图例标示的是颜色不同的线条,需要指定col=加上颜色值组成的向量。如果图例标示的是符号不同的点,则需指定pch=加上符号的代码组成的向量。如果图例标示的是不同的线条宽度或线条类型,请使用lwd=或lty=加上宽度值或类型值组成的向量。要为图例创建颜色填充的盒形(常见于条形图、箱线图或饼图),需要使用参数fill=加上颜色 |
其他常用的图例选项包括用于指定盒子样式的bty
、指定背景色的bg
、指定大小的cex
,以及指定文本颜色的text.col
。指定horiz=TRUE
将会水平放置图例,而不是垂直放置。
2.5 文本标注
图形的文本标注主要使用text()
,mtext()
。
text(location, 'text', pos, ...)
mtext('text', side, line=n, ...)
参数 | 描述 |
---|---|
location | 文本的位置参数。可为一对x,y坐标,也可通过指定location为locator(1)使用鼠标交互式地确定摆放位置 |
pos | 文本相对于位置参数的方位。1=下,2=左,3=上,4=右。如果指定了pos,就可以同时指定参数offset=作为偏移量,以相对于单个字符宽度的比例表示 |
side | 指定用来放置文本的边。 1=下, 2=左, 3=上, 4=右。你可以指定参数line=来内移或外移文本,随着值的增加,文本将外移。也可使用adj=0将文本向左下对齐,或使用adj=1右上对齐 |
对于数学标注,可以使用plotmath()
函数。
3、图形组合
R图形组合有三种方法par(mfrow=...)
、layout()
、par(fig=...)
。
3.1 par(mfrow=...)
使用par()
中的mfrow=c(nrows, ncols)
或mfcol=c(nrows, ncols)
可以快速创建nrows行ncols列的图形矩阵。
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2)) #将图形分为2行2列
plot(...) #绘制第一个图
plot(...) #第二
plot(...) #第三
plot(...) #绘制最后一个图
par(opar)
3.2 layout()
函数layout()
的调用形式为layout(mat)
,其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
attach(mtcars)
###将画布分为三部分,第一部分为一行,另两部分平分另一行
layout(matrix(c(1,1,2,3), 2,2, byrow=TRUE))
hist(mpg) #第一个图独占第一行
hist(gear) #第二个图位于第二行左半部
hist(disp) #第三个图位于第二行右半部
detach(mtcars)
为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数。其形式为:widths = 各列宽度值组成的一个向量, heights = 各行高度值组成的一个向量。widths和heights中的向量数值都可以通过相对值指定。
layout()函数能够让我们轻松地控制最终图形中的子图数量和摆放方式,以及这些子图的相对大小。
attach(mtcars)
###同样将图分为3部分,只是第这三部分所占比例各不相同
layout(matrix(c(1,1,2,3),2,2,byrow=TRUE), widths=c(3,1), heights=c(1,2))
hist(mpg) # 第一个图独占一行,高度占总高度1/3(heights=c(1,2))
hist(gear) # 第二个图在第二行左边,高度占总高度2/3, 宽度占行宽的3/4(widths=c(3,1))
hist(disp) # 第三个图在二行右边,高度占总高度2/3, 宽度占行宽的1/4(widths=c(3,1))
detach(mtcars)
3.3 par(fig=....) 图形的精确控制
fig
参数使我们能够精确的排布各个图形的位置,将各个图形进行叠加。
> opar<-par(no.readonly = T)
###设置第一幅图的位置, X和Y轴范围都为(0,0.8)
> par(fig=c(0,0.8,0,0.8))
> plot(mtcars$wt, mtcars$mpg, xlab='MPG', ylab='Weight')
### 设置第二幅图,X轴范围为(0,0.8),Y轴范围为(0.55, 1)
> par(fig=c(0,0.8,0.55, 1), new=T) #注意这里的new参数一定要设置
> boxplot(mtcars$wt,horizontal = T,axes=F) #axes=F, 这里将所有的箱线图的坐标轴取消了
###设置第三幅图的位置,X轴范围为(0.65, 1),Y轴范围(0,0.8)
> par(fig=c(0.65, 1, 0, 0.8), new=T)
> boxplot(mtcars$mpg,axes=F)
###在上方添加文本
> mtext("Enhanced scatterplot", side=3,outer=T,line=-3)
###添加标题,看图可以知道这时标题并非整个图的标题,而是第三幅图的标题
> title(main="hellow world!")
要理解这幅图的绘制原理,请试想完整的绘图区域:左下角坐标为(0,0),而右上角坐标为(1,1)。下图是一幅示意图。参数fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。
另外值得注意的是,各独立子图所需空间的大小可能与设备相关。如果遇了“Error in plot.new(): figure margins too large”这样的错误,尝试在整个图形的范围内修改各个子图占据的区域位置和大小。