ggplot2及其衍生包可以绘制各种各样的复杂绘图,常见的使用场景是使用ggplot2绘制单图,使用ggpubr、cowplot、gridExtra及patchwork等工具包进行拼图,尤其是patchwork包,它的函数设计理念很优秀,使用很方便 。
拼图可以解放很多ggplot2的绘图限制,是一个非常有意思的话题。但是如果做过拼图的人就会发现,拼图只是简单的将两个图摆放在一起,图与图之间依然保留着很多空白空间。
ggplot_1
假如可以去除这个空白空间,那就可以实现无缝拼图,可以在很多复杂图表的绘制中发挥作用。
ggplot_2
为了更清晰的展示这个图的两个子图,可以在子图的panel上添加一个边框,可以发现两个子图的绘图区域的确是无缝拼接。
ggplot_2
下面先复现一下上面的两个图:
library(ggplot2)
library(magrittr)
library(patchwork)
# 1. 常规拼图
p <-
iris %>%
ggplot(aes(x = Species, y = Sepal.Length, fill = Species)) +
geom_boxplot()
p/p
# 2. 无缝拼图
p_clean <-
p +
theme(
axis.title.x = element_blank(), # 去除x轴标题
axis.text.x = element_blank(), # 去除x轴标签
axis.ticks.x = element_blank(), # 去除x轴ticks
axis.ticks.length.x = unit(0, "mm"), # ticks去除的关键,ticks的绘图区域调为0
plot.margin = margin() # 去除绘图margin
) +
scale_y_discrete(expand = c(0, 0)) # 若为白色背景,还需要去除轴两侧的空白填充
p_clean / p_clean
# 3. 无缝拼图,添加边框
p_clean2 <- p_clean +
theme(
panel.background = element_rect(fill = NA, colour = "black")
)
p_clean2/p_clean2
一个图在拼接的时候,需要处理的细节有:
这里有点抽象,举个例子:
# 令p为常规ggplot2绘图对象
# aplot可以完成如下工作:
p %>% insert_right(p) %>% insert_right(p) %>% insert_right(p)
# 但是无法完成如下工作:
p_a1 <- p %>% insert_right(p)
p_a2 <- p %>% insert_right(p)
p_a1 %>% insert_right(p_a2)
虽然从逻辑上,这两个图的绘制结果应该是一样的。
但是本文的所说的patchwork无缝拼图就不存在这个问题,任意组合、任意拼接、任意嵌套。
复杂绘图往往比较个性化,具体情况就不展开了,最后留一个小问题:
如果仔细看的话,会发现本文所举例子中的无缝拼图中间的x轴上有两个细微的空白gaps,这个是怎么造成的?