R主要有两大功能,除了统计分析外,R数据可视化也是及其重要的。
在R中绘图时,大多时候是绘制一张图形,但是有时也需绘制多张图形,并且是多张图形的相互组合,在绘制好后在需要输出组合图形。
今天介绍下R中基础绘图包的图形布局。
1. 绘图设备
绘图设备种类取决于操作系统,在Unix/Linux
下,绘图窗口称为x11,Windows
下称为windows。
可以使用相关代码打开多个绘图设备,最后打开的绘图设备将成为当前绘图设备。
x11() # 打开绘图窗口,Windows也适用
?device # 查看可用的绘图设备列表
postscript(), pdf(), png() # 这三个都可以打开对应的绘图设备
dev.list() # 显示打开的绘图设备,每个绘图设备都有个编号
dev.cur() # 查看当前的设备
dev.new() # 打开新的图形设备
dev.set(3) # 通过指定设备编号来改变当前的设备
dev.off() # 关闭图形设备;默认关闭当前设备
# 可以指定设备编号来关闭指定图形设备
win.metafile() # 打开Windows Metafile设备
2. 图形布局
在使用R语言进行绘图时,有时候我们在绘图设备上不止绘制一张图形,可能是几张图形的互相组合,因此我们可以分割图形设备来将不同图形分别绘制到图形设备的不同区域。
可以分割图形设备的函数主要有两个:layout()
函数和par()
函数。
2.1 layout()函数
layout()函数把当前的图形窗口分割为多个部份,多个图形将一次显示在各部分中。
layout()函数的主要参数为一个都是整数值元素的矩阵,可以在函数中指定widths
和heights
参数来更精确的控制每幅图形的大小。
分割的图形设备默认按列编号,也可以在matrix()
行数中指定byrow=TRUE
来按行编号。
layout(matrix(1:4, 2, 2), # 设备分割为4份,按列编号为1、2、3、4,
widths=c(1, 3), # 宽为1:3
heights=c(3, 1)) # 高为3:1
layout.show(4) # 显示创建分割的设备
layout(matrix(c(1:3, 3), 2, 2))
layout.show(3) # 显示创建分割的设备
# 设备分割为4份,设备按列编号为1、2、3、3。
# 但是第3份和第4份合并在一起
layout(matrix(0:3, 2,2), # 矩阵编号可以包括0,0为表示设备不存在
c(1,3), c(1,3)) # 设备编号为1、2、3,宽为1:3,高为1:3。
layout.show(3) # 显示创建分割的设备
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
layout.show(3) # 显示创建分割的设备
2.2 par()函数
在R中除了使用layout()函数来绘制组合图形外,还可以使用par()函数绘制。
在par()函数中使用图形参数mfrow=c(nrows, ncols)
来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。另外,可以使用mfcol=c(nrows, ncols)
按列填充矩阵。
par(mfrow=c(3,1)) # 创建按行填充,行数为3,列数为1的图形矩阵
par(mfcol=c(2,2)) # 创建按列填充,行数和列数为2的图形矩阵
# 绘制的图形按列次序依次使用各子窗口
layout(matrix(1:4, 2, 2)) # 与上面等效
2.3 布局精细控制
有时候我们除了分割图形设备外,还需要对图形布局有更精细的控制,这个可以使用图形参数fig来完成。
参数fig=的取值是一个形如c(x1, x2, y1, y2)的数值向量。
fig=默认新建一幅图形;如需添加一幅图到一幅现有图形上,请设定参数new=TRUE
。
opar TRUE) # 自定义图形参数
par(fig=c(0, 0.8, 0, 0.8)) # 设置图形区域
plot(mtcars$wt, mtcars$mpg, # 绘制图形
xlab="Miles Per Gallon",
ylab="Car Weight")
par(fig=c(0, 0.8, 0.55, 1), new=TRUE) # 设置图形区域,并将新图形添加到现有图形中
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE) # 绘制图形
par(fig=c(0.65, 1, 0, 0.8), new=TRUE) # 设置图形区域,并将新图形添加到现有图形中
boxplot(mtcars$mpg, axes=FALSE) # 绘制新图形
par(opar)
可以反复的调整fig参数来达到合适的图形布局。
参考资料:
- [美]Robert I. Kabacoff著. R语言实战(第2版)[M].王小宁等译. 北京:人民邮电出出版社.2016.
- Emmanuel Paradis著.
R for Beginners
[M]. 王学枫等译. 2005.