Author:Junfei Xie
Date: 15-10-2021
本文汇总了笔者所见到的实现组图的各种方法,本着“由繁入简”的原则依次展开,相信会对组图的实现有更加全面的认识,读者可以细细体会不同实现方法的微妙之处,加深记忆。
R基础函数
在par()函数种使用图形参数mfrow=c(nrow, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。同理,可以使用mfcol=c(nrow, ncols)按列填充的图形矩阵。
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow = c(2, 2))
plot(wt, mpg, main = "Scatterplot of wt vs. mpg" )
plot(wt, disp, main = "Scatterplot of wt vs. displ")
hist(wt, main = "Histogram of wt")
boxplot(wt, main = "Boxlot of wt")
par(opar)
detach(mtcars)
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
函数layout()的调用形式为layout(mat),其中mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
attach(mtcars)
layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths = c(3, 1), heights = c(1, 2))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
R包实现组图
Data prepare
(a <- qplot(date, unemploy, data = economics, geom = "line"))
(b <- qplot(uempmed, unemploy, data = economics) + geom_smooth(se =F))
(c <- qplot(uempmed, unemploy, data = economics, geom = "path"))
(d <- qplot(mpg, wt, data = mtcars))
Method1:
这是ggplot2书本中给定的组图案例,用到了grid包,运用网格法的工作原理。
grid.newpage()
# pushViewport函数提供了添加视图以及在树中的视图之间导航的方法。
pushViewport(viewport(layout = grid.layout(2,2)))
# viewport函数创建视图,描述图形设备上的矩形区域,并在这些区域中定义许多坐标系统。
vplayout <- function(x,y)
viewport(layout.pos.row = x, layout.pos.col = y)
print(a, vp = vplayout(1, 1:2))
print(b, vp = vplayout(2, 1))
print(c, vp = vplayout(2, 2))
Method2:
The Rmisc library contains many functions useful for data analysis and utility operations.
用的最多的可能就是summarySEwithin 函数,可以用来处理被试内变量画error bar图。
install.packages("Rmisc")
library(Rmisc)
multiplot(a, b, c, d, cols=2)#按列排序
Method3:
Provides a number of user-level functions to work with "grid" graphics, notably to arrange multiple grid-based plots on a page, and draw tables.
library(gridExtra)
grid.arrange(a, b, c, d, nrow=2)#按行排序
Method4:
Provides various features that help with creating publication-quality figures with 'ggplot2', such as a set of themes, functions to align plots and arrange them into complex compound figures, and functions that make it easy to annotate plots and or mix plots with images.
install.packages("cowplot")
library(cowplot)
plot_grid(a, b, c, d,
labels = c("A", "B", "C", "D"),ncol = 2)#按行排序
Method5:
'ggpubr' provides some easy-to-use functions for creating and customizing 'ggplot2'- based publication ready plots.
组图只是其功能的一小部分,更多的绘图功能可以参看以往的绘图专题。
install.packages("ggpubr")
library(ggpubr)
ggarrange(a, b, c, d, nrow = 2, ncol = 2,
labels = c("A", "B", "C", "D"), font.label = list(color = "red"))
#颜色为红色(通过font.label = list()修改),无法通过label.color = 'red'或其他方式修改。
Method6:
'patchwork' is a package that expands the API to allow for arbitrarily complex composition of plots by, among others, providing mathematical operators for combining multiple plots.
其开发定位就是用于组图,强烈推荐。
- 简单组图,直接使用
+
连接,根本不需要任何参数记忆。
当然,不用创建对象,也可以像ggplot2本身使用一样相加。
install.packages("patchwork")
library(patchwork)
a + b + c + d
- 可以使用布局函数plot_layout对拼接细节进行更细致地指定,像每个图的范围,图形的排列。
a + b + plot_layout(ncol = 1, heights = c(1, 2) )
- 如果你想要在图形之间添加一些空间,可以使用plot_spacer()填充一个空白格。
a + plot_spacer() + b
- 图形之间可以进行嵌套,发挥自己的想象,随意组图,使用
{}
或者()
:
a + {
b + {
c +
d +
plot_layout(ncol = 1)
}
} +
plot_layout(ncol = 1)
- 高级功能:为了简化上面的嵌套操作,patchwork提供了更为简便的操作符。
-
操作符将左右两边的对象放在同一个嵌套层,而不是像+号把右边放入左边的嵌套层。
|
与/
操作符可以用来进行水平和垂直方向的布局。
a + b - c + plot_layout(ncol = 1)
(a | b | c) / d
- 子图多的时候同时修改图形比较麻烦,patchwork提供了
*
与&
用来简化代码,它们都可以将同一个操作应用到所有图形。
(a + (b + c) + d + plot_layout(ncol = 1)) * theme_bw()
(a + (b + c) + d + plot_layout(ncol = 1)) & theme_bw()
另一种常用的就是分面来实现组图,但是两者之间仍有区别,分面的组图,必须来自一个数据框。
综上,实现组图的方法虽然众多,但是没有必要每个都精通,选择1到2个自己喜欢的或者易于掌握的即可,其他的作为了解扩展,运用时直接替换响应参数即可。
参考资料: