首页 > 科研绘图 > 如何对图表批量组合、对齐、画中画、合并图例、自动化加标签。。。
2022
06-19

如何对图表批量组合、对齐、画中画、合并图例、自动化加标签。。。

关于图表的组合排版,在之前的微信文章中介绍过很多常规的方法,比如《绘制复杂组合图表的独家秘笈分享》 《如何用Graphpad Prism绘制超复杂组合图?》 《如何用Origin完成图表排版?》 等。可是,有小伙伴就问了,正如小项羽所言,“剑一人敌,不足学,学万人敌”,那么有没有批量自动化拼图的方法?

既然是批处理,就免不了需要写脚本,这里推荐两个专职拼图的R包:cowplot和patchwork,二者在很多地方都很相似,下面我们就一起比较、学习下如何使用这两个R包实现图表的批量组合、嵌套、对齐、画中画、自动化加标签、图例合并等操作。

#先使用ggplot2绘制4个范例图表,数据为R自带的mtcars数据集;

library(ggplot2)

head(mtcars)

p1<- ggplot(mtcars) + geom_point(aes(mpg, disp))

p1

p2<- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear),fill= "skyblue")

p2

p3<- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) +

theme(axis.text.x = element_text(size = 10, angle = 60, vjust = 0.5))

p3

p4<- ggplot(mtcars) + geom_bar(aes(gear),fill= "skyblue") + facet_wrap(~cyl)

p4

#载入patchwork包;

library(patchwork)

#载入cowplot包;

library(cowplot)

整合多个图表

patchwork:

#使用“+”操作符组合图表;

p<- p1 + p2 + p3 + p4

p

#patch可以自动添加图表标签;

p+plot_annotation(tag_levels = 'A',tag_suffix='.')

#tag_levels:'a' 小写字母, 'A' 大写字母, '1' 数字, 'i' 小写罗马数字, 'I' 大写罗马数字;

#tag_prefix和tag_suffix设置序号的前后缀字符 ;

cowplot:

#使用plot_grid函数组合图表;

plot_grid(p1, p2, p3, p4)

#cowplot也可自动添加编号标签;

plot_grid(p1, p2, p3, p4,labels = "AUTO")

#调整标签的字体大小(默认14)、样式、颜色等;

plot_grid(p1, p2, p3, p4,labels = c('A.', 'B.','C.', 'D.'),

label_size= 12,

label_fontfamily= "serif",

label_fontface= "plain",

label_colour= "black")

通过比较组合效果可以发现,默认情况下,二者会保持拼图结果为正方形;patchwork有自动对齐图形区域的功能,而cowplot的组合效果更紧凑。

指定排列顺序

patchwork:

#cowplot主要使用nrow 和 ncol两个参数确定排列方式,并“逐行”填充;

plot_grid(p1, NULL, p2,p3, ncol = 2,align = "hv")

cowplot:

#cowplot主要使用nrow 和 ncol两个参数确定排列方式:

plot_grid(p1, NULL, p2,p3,labels = "AUTO", ncol = 2)

设置拼图比例

patchwork:

#设置宽高比例;

pp<- p2 + p3 + p1 + plot_spacer

pp+ plot_layout(widths = c(3, 1), heights = c(3,1))

cowplot:

#设置宽高比例;类似的使用rel_widths 和 rel_heights 设置图表的相对大小;

plot_grid(p2, p3, p1, NULL, rel_widths = c(1.5, 1),rel_heights=c(2,1))

嵌套拼图

patchwork:

patchwork提供了两个操作符来直接实现不同图表的嵌套拼接。

#|:将这些图横向排列,/:将图表竖向堆叠(竖排优先级高于横排);

p1| (p2 / p3)

( p2| p3 )/ (p1 | plot_spacer)

cowplot:

#“手工”嵌套;

bottom_row<- plot_grid(p2, p3, nrow = 2)

bottom_row

plot_grid(p1, bottom_row, ncol = 2)

指定对齐方式

patchwork:

#拼图时自动对齐;

p1+ p2 + p3 + p4

#Tips:获取维度信息;

p3_dims<- get_dim(p3)

p1_aligned<- set_dim(p1, p3_dims)

p3

p1_aligned

#注意p1_aligned无法和其他图表组合;

cowplot:

#使用plot_grid函数的align参数使网格线和坐标轴对齐;

#可组合使用:align = "vh"` 或 `align = "hv"

plot_grid(p1, p3, ncol = 2, align = "h")

#垂直对齐失败;

plot_grid(p1, p3, nrow = 2, align = "v")

#坐标轴范围不一致时,可以对齐坐标轴;

#组合关系:"t" (top), "r" (right), "b" (bottom), and "l" (left);

plot_grid(p1, p2, p3, p4, nrow = 2, align = "v", axis = "tlbr")

合并图例

patchwork:

#如果图例颜色、样式不同,会同时保留;

p1+ p2 + p3 + p4 +plot_layout(guides = 'collect')

( p2/ p3 + plot_layout(guides = 'collect')) | p1

(( p2/ p3 + plot_layout(guides = 'auto')) | p1) + plot_layout(guides = 'collect')

默认guides = 'auto',当guides = 'collect'时合并图例,当guides = 'keep'时强制将图例置于原图旁。

cowplot:

#对于cowplot,需先绘制无图例的组合图;

p3a<- p3 + theme(legend.position = "none")

plot2<- plot_grid(p1, p2, p3a, p4)

plot2

#提取图例;

legend<- get_legend(p3)

#将图例组合进来;

plot_grid(plot2, legend, rel_widths = c(3, 0.5))

#同样的方法,可以将图例加到底部;

legend_b<- get_legend(p3 + theme(legend.position = "bottom"))

plot_grid(plot2, legend_b, nrow = 2,rel_heights = c(3, 0.5))

画中画效果

patchwork:

#inset_element指定相对位置插入图形;

#align_to ='panel' (默认), 'plot', 'full';

p1+ inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1,

align_to= 'panel', ignore_tag = TRUE)+theme_cowplot(10)

#这里使cowplot的theme_cowplot主题,字体为10号;

cowplot:

#先应用主题;

p2a<- p2+theme_cowplot(10)

#使用draw_plot函数在指定的位置添加图形;

ggdraw(p1) +

draw_plot(p2a, x=0.58, y=0.58, width =0.4, height =0.4)

#可以加上标签;

ggdraw(p1 +theme_half_open(14)) +

draw_plot(p2a, x=0.58, y=0.58, width =0.4, height =0.4) +

draw_plot_label(c( "A", ""),c(0, 0.45),c(1, 0.95),size = 15)

通过对这两个R包的拼图方法和效果比较,我可能更喜欢patchwork的一些,操作简单更容易上手,好啦,今天的内容就分享到这里啦~

最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情