参考:https://www.jianshu.com/p/dc97bc6ae7e9
作者:小洁忘了怎么分身
patchwork
拼图方式
两张图
图形的两两拼接,可以直接使用符号完成。
横向拼接
p1 | p2
library(ggplot2)
library(patchwork)
p1 <- ggplot(mpg) + geom_point(aes(cty, hwy))
p2 <- ggplot(mpg) + geom_bar(aes(manufacturer)) +
coord_flip()
p1|p2
纵向拼接
p1 / p2
library(ggplot2)
library(patchwork)
p1/p2
多张图
直接添加
类似两张图的添加方法,直接按照横向或纵向添加。
library(ggplot2)
library(patchwork)
p3 <- ggplot(mpg) + geom_boxplot(aes(manufacturer, hwy)) +
facet_grid(year~.) +
coord_flip()
p1+p2+p3
除此之外,如果横向添加四张图,patch 会自动调整图的位置。
p4 <- ggplot(mpg) +
geom_tile(aes(factor(cyl), drv, fill = stat(count)), stat = 'bin2d')
p1+p2+p3+p4
自定义添加位置
plot_layout()
plot_layout 函数类似地继承了矩阵与分面中的相关参数 ncol
, nrow
与 byrow
。默认按行排列。
p1+p2+p3+p4+plot_layout(byrow=F,nrow=2)
p1+p2+p3+p4+plot_layout(nrow=4)
组合添加符号
(p1|p2)/p3
利用 |
与 /
可以自定义水平或垂直布局。
设定design 参数
无需坐标与长宽设定的参数,也可以对布局进行设定。可以使用数字也可以使用英文字母。
design <- "
122
1#3
443
"
p1 + p2 + p3 + p4
我们可以把整个画板想象为一个3x3 的空间,其中各个数字表示对应的各个图像所在的位置,而 #
用来表示空白区域。
嵌套添加
通过嵌套,相当于将嵌套内的图形作为一个独立的子单元进行对应分割部分的处理。 {}
与 ()
均可以达到嵌套效果。
p1 + {
p2 + {
p3 +
p4 +
plot_layout(ncol = 1)
}
} +
plot_layout(ncol = 1)
添加空白空间
如果在添加图形时想要在图形间预留一些空白空间,可以使用 plot_spacer()
。
p1+p2+plot_spacer()+p3
添加标记
整体标记
layout <- "
122
1#3
443
"
p1 + p2 + p3 + p4 + plot_layout(design = layout) +
plot_annotation(title = 'mpg is so cool')
子图标记
也就是换个参数的是, tag_levels
会自动识别数字 1
, 字母A
,罗马数字 I
等。
p1 + p2 + p3 + p4 + plot_annotation(tag_levels = 'A')
统一处理
当我们希望对全部图形进行处理但奈何单独对每个对象一一处理非常繁琐之时,可以利用 *
与 &
,前者会为当前嵌套层的所有图像进行处理,而后者则会按照递归,处理所有的图层。
(p1 + p2 + p3 + p4) * theme_bw()
图例处理
设定 guides
参数。
p1 + p2 + p3 + p4 + plot_layout(guides = 'collect')
对比一下之前
其他内容
直接添加
除了通过为创建的图形添加对象,通过对象调整图象位置,也可以通过ggplot 作图,直接添加。
ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggplot(mtcars) +
geom_boxplot(aes(gear, disp))