查看: 4384|回复: 38

[R语言] 如何对图表批量组合、对齐、画中画、合并图例、自动化...

  [复制链接]

迅猛龙

Rank: 8Rank: 8

主题
166
注册时间
2020.6.16
在线时间
99 小时

发表于 2020.11.14 09:33:57 | 显示全部楼层 |阅读模式
本帖最后由 基迪奥-Jt桃 于 2020.11.14 09:33 编辑

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

既然是批处理,就免不了需要写脚本,这里推荐两个专职拼图的R包:cowplot和patchwork,二者在很多地方都很相似,下面我们就一起比较、学习下如何使用这两个R包实现图表的批量组合、嵌套、对齐、画中画、自动化加标签、图例合并等操作。
[AppleScript] 纯文本查看 复制代码
#先使用ggplot2绘制4个范例图表,数据为R自带的mtcars数据集;
library(ggplot2)
head(mtcars)



[AppleScript] 纯文本查看 复制代码
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:

[AppleScript] 纯文本查看 复制代码
#使用“+”操作符组合图表;
p <- p1 + p2 + p3 + p4
p



[AppleScript] 纯文本查看 复制代码
#patch可以自动添加图表标签;
p+plot_annotation(tag_levels = 'A',tag_suffix='.')
#tag_levels:'a' 小写字母, 'A' 大写字母, '1' 数字, 'i' 小写罗马数字, 'I' 大写罗马数字;
#tag_prefix和tag_suffix设置序号的前后缀字符 ;



cowplot:

[AppleScript] 纯文本查看 复制代码
#使用plot_grid()函数组合图表;
plot_grid(p1, p2, p3, p4)



[AppleScript] 纯文本查看 复制代码
#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:

[AppleScript] 纯文本查看 复制代码
#cowplot主要使用nrow 和 ncol两个参数确定排列方式,并“逐行”填充;
plot_grid(p1, NULL, p2,p3, ncol = 2,align = "hv")



cowplot:

[AppleScript] 纯文本查看 复制代码
#cowplot主要使用nrow 和 ncol两个参数确定排列方式:
plot_grid(p1, NULL, p2,p3,labels = "AUTO", ncol = 2)



设置拼图比例

patchwork:

[AppleScript] 纯文本查看 复制代码
#设置宽高比例;
pp <- p2 + p3 + p1 + plot_spacer()
pp + plot_layout(widths = c(3, 1), heights = c(3,1))



cowplot:

[AppleScript] 纯文本查看 复制代码
#设置宽高比例;类似的使用rel_widths 和 rel_heights 设置图表的相对大小;
plot_grid(p2, p3, p1, NULL, rel_widths = c(1.5, 1),rel_heights=c(2,1))



嵌套拼图

patchwork:

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

[AppleScript] 纯文本查看 复制代码
#|:将这些图横向排列,/:将图表竖向堆叠(竖排优先级高于横排);
p1 | (p2 / p3)
(p2 | p3 )/ (p1 | plot_spacer())



cowplot:

[AppleScript] 纯文本查看 复制代码
#“手工”嵌套;
bottom_row <- plot_grid(p2, p3, nrow = 2)
bottom_row
plot_grid(p1, bottom_row, ncol = 2)



指定对齐方式

patchwork:

[AppleScript] 纯文本查看 复制代码
#拼图时自动对齐;
p1 + p2 + p3 + p4



[AppleScript] 纯文本查看 复制代码
#Tips:获取维度信息;
p3_dims <- get_dim(p3)
p1_aligned <- set_dim(p1, p3_dims)
p3
p1_aligned
#注意p1_aligned无法和其他图表组合;


cowplot:

[AppleScript] 纯文本查看 复制代码
#使用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:

[AppleScript] 纯文本查看 复制代码
#如果图例颜色、样式不同,会同时保留;
p1 + p2 + p3 + p4 +plot_layout(guides = 'collect')



[AppleScript] 纯文本查看 复制代码
(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:

[AppleScript] 纯文本查看 复制代码
#对于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))



[AppleScript] 纯文本查看 复制代码
#同样的方法,可以将图例加到底部;
legend_b <- get_legend(p3 + theme(legend.position = "bottom"))
plot_grid(plot2, legend_b, nrow = 2,rel_heights = c(3, 0.5))



画中画效果

patchwork:

[AppleScript] 纯文本查看 复制代码
#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:

[AppleScript] 纯文本查看 复制代码
#先应用主题;
p2a <- p2+theme_cowplot(10)
#使用draw_plot()函数在指定的位置添加图形;
ggdraw(p1) + 
  draw_plot(p2a, x=0.58, y=0.58, width =0.4, height =0.4)



[AppleScript] 纯文本查看 复制代码
#可以加上标签;
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的一些,操作简单更容易上手,好啦,今天的内容就分享到这里啦~

本文作者:基迪奥-莫北
               

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2018.5.17
在线时间
51 小时

发表于 2020.11.14 09:42:21 | 显示全部楼层
厉害厉害
大萨达所大所
回复

使用道具 举报

帝王蝶

Rank: 4

主题
5
注册时间
2016.10.11
在线时间
36 小时

发表于 2020.11.14 21:29:09 | 显示全部楼层
咔咔咔咔咔咔扩扩扩扩扩扩扩扩扩扩扩扩扩扩扩
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2020.2.12
在线时间
35 小时

发表于 2020.11.15 13:42:48 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.11.20
在线时间
7 小时

发表于 2020.11.15 18:06:19 | 显示全部楼层
学到了,记下来好好学一下才行
新的一天加油!
回复 支持 反对

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
5
注册时间
2020.3.21
在线时间
20 小时

发表于 2020.11.15 23:14:51 | 显示全部楼层
真的学习了
周五周五了
回复 支持 反对

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2016.8.30
在线时间
158 小时

发表于 2020.11.16 08:55:05 | 显示全部楼层
优秀
啦啦啦
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
1
注册时间
2016.9.4
在线时间
138 小时

发表于 2020.11.16 10:12:41 | 显示全部楼层
今日已签到
回复

使用道具 举报

草履虫

Rank: 2

主题
0
注册时间
2020.4.7
在线时间
1 小时

发表于 2020.11.16 10:14:39 | 显示全部楼层
收藏  厉害啦啦
开心
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2017.11.2
在线时间
30 小时

发表于 2020.11.16 16:00:13 | 显示全部楼层
学到了,很详细
又到了星期五
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2016.4.29
在线时间
38 小时

发表于 2020.11.17 08:45:59 | 显示全部楼层
这个好有用的。我也要用
好忙好忙呀
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
27
注册时间
2016.1.8
在线时间
456 小时

发表于 2020.11.17 10:04:55 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
5
注册时间
2016.10.11
在线时间
36 小时

发表于 2020.11.18 16:38:01 | 显示全部楼层
咔咔咔咔咔咔扩扩扩扩扩扩扩扩扩扩扩扩扩扩扩
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2016.10.11
在线时间
5 小时

发表于 2020.11.19 15:07:50 | 显示全部楼层
啦啦啦啦啦啦啦啦啦啦啦啦啦啦绿绿绿绿绿绿绿绿绿绿绿绿绿
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2018.12.22
在线时间
40 小时

发表于 2020.11.19 20:33:27 | 显示全部楼层
厉害厉害
回复

使用道具 举报

帝王蝶

Rank: 4

主题
1
注册时间
2016.8.25
在线时间
57 小时

发表于 2020.11.23 22:33:39 | 显示全部楼层
厉害厉害
加油啊同志们
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2020.11.21
在线时间
14 小时

发表于 2020.11.26 09:20:35 | 显示全部楼层
学习学习
坚持就是胜利!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
2
注册时间
2016.4.29
在线时间
38 小时

发表于 2020.11.28 16:10:17 | 显示全部楼层
好棒好棒
好忙好忙呀
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.12.2
在线时间
1 小时

发表于 2020.12.2 10:47:01 | 显示全部楼层
学习了学习了
回复 支持 反对

使用道具 举报

帝王蝶

Rank: 4

主题
5
注册时间
2016.10.11
在线时间
36 小时

发表于 2020.12.2 16:48:22 | 显示全部楼层
咔咔咔咔咔咔扩扩扩扩扩扩扩扩扩扩扩扩扩扩扩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表