R语言ggplot2 | 告别AI和PS,地表最全R语言拼图


   巧用R语言拼图,大大提高工作效率。众所周知,一张完整的图是由多种多样的图形组合而成。通常,我们先绘制好每一张图,然后再利用其他软件(例如PS、AI等)完成整张图的排版与合并。但如今,可以利用R语言能够完成拼图这个繁琐的任务,并且非常出色。该博文主要介绍R语言中较为常用的四个拼图包(ggpubr,patchwork,cowplot,customLayout)。每个包各有特色,我主要讲解如何使用这四个包的拼图功能,以及一些个人感悟和建议。

学习R语言拼图的意义

   在不认识R语言之前,通常我们利用PS或者AI来解决拼图的需求。但是当你的图绘制的越来越多,拼图的工作量就变得更加繁琐和枯燥,这也会大大影响了你的心情和工作效率。同时,这么多的网格线容易看得眼睛疼(一脸苦涩,经历过的同学肯定深有体会)。随着技术的发展,各大编程语言的流通,R语言拼图的优势也显现出来了,我们只需要看懂代码利用几条简单的命令就可以让几张甚至几十张图瞬间完成,真是太完美了。

R语言拼图程序包介绍

   R语言能够完成拼图的包应该有多种。本篇博文中,我给大家总结了地表最常用的四种拼图包,分别是patchwork、cowplot、ggpubr、customLayout。这几个拼图包都可以与绘图神器"ggplot2"包完美的结合,必须掌握。只要我们把这几个包都掌握了就可以与AI、PS真正地say goodbye了~

"ggpubr"包中的 ggarrange()函数

#拼图包--ggpubr

#看看ggarrange函数介绍
?ggarrange()

#利用自带的数据集
data("ToothGrowth")

#将数据集赋值给df
df <- ToothGrowth

#将df数据中dose列中的向量转换成因子型(as.factor)
df$dose <- as.factor(df$dose)

# 绘制多张图
# 箱线图
bxp <- ggboxplot(df, x = "dose", y = "len",
                 color = "dose", palette = "jco")
# 点图
dp <- ggdotplot(df, x = "dose", y = "len",
                color = "dose", palette = "jco")
# 密度图
dens <- ggdensity(df, x = "len", fill = "dose", palette = "jco")

# 利用ggarrange函数完成拼图
ggarrange(bxp, dp, dens, ncol = 2, nrow = 2)
# bxp dp dens分别是前面所绘制的三种图,然后我们按2行2列完成拼图

# 对多个图使用通用的图例
ggarrange(bxp, dp, dens, common.legend = TRUE)
# common.legend=T即可

拼图结果1:
在这里插入图片描述
拼图结果2(共用图例):
在这里插入图片描述
更改图例位置(将图例放在整图的右边):

ggarrange(bxp, dp, dens, common.legend = TRUE, legend="right")

在这里插入图片描述
给每张子图添加标签(A,B,C):

ggarrange(bxp, dp, dens,
common.legend = TRUE,
legend = "top",
labels = c("A","B","C"))

在这里插入图片描述

"patchwork"包不需要任何函数

   该包加载后,支持直接p1+p2拼图,非常简单;布局代码尽管繁多,但是易理解好记;可以统一修改所有子图。直接上代码:

#加载R包
library(ggplot2)
library(patchwork)

?patchwork

#绘制散点图
p1 <- ggplot(mtcars) +
  geom_smooth(aes(hp, wt)) +
  ggtitle('Plot A')

#绘制箱线图
p2 <- ggplot(mtcars) +
  geom_boxplot(aes(gear, disp, group = gear)) +
  ggtitle('Plot B')

#完成拼图
#可以使用“+” 或者“/”
p1 + p2
p1 / p2

绘制结果:
在这里插入图片描述
在这里插入图片描述
进一步我们看看多图绘制并拼图

p3 <- ggplot(mtcars) +
  geom_point(aes(hp, drat, colour = cyl)) +
  ggtitle('Plot C')
p4 <- ggplot(mtcars) +
  geom_bar(aes(vs)) +
  facet_wrap(~cyl) +
  ggtitle('Plot D')
p1 + p2 + p3 + p4

在这里插入图片描述
调节子图的宽度,通过plot_layout(widths = c(3, 1))来设置宽度比例为3:1

p1+p2+plot_layout(width=c(3,1))

在这里插入图片描述

p1+p2+plot_layout(width=unit(c(9,3), c("cm","cm")))

图没错,如果直接指定图片的实际宽度为9cm和3cm。与上图的区别在于,指定比例,当绘图区域的宽度发生变化的时候,图片的宽度也会跟着发生变化,但保持比例为3:1。如果直接指定了实际的宽度,不论你的绘图区域的宽度如何发生变化,图片的宽度始终保持不变。所以从这个图与白色画布背景不完全匹配就能看出明显的区别。
在这里插入图片描述
我们再看看多张图的比例变化:

p1+p2+p3+plot_layout(width=c(1,2,3))

在这里插入图片描述
同时调节宽度和高度:

p1+p2+p3+p4+
plot_layout(widths = c(1.5, 1.5),height=c(2,1))

在这里插入图片描述
还可以利用小括号调节图片排版(括号主要存在一个优先级):

p1 / (p2 | p3) # / 斜杠前表示在整个画布的上方,后表示在下方。
# | 竖线符号则表示左右的顺序位置。可以根据自己需求继续添加竖线及要表达的图

在这里插入图片描述
如果想要特别突出重点核心图,利用plot_spacer()函数,创建了一个空的透明补丁,可以添加该补丁来将其他图分开。代码如下:

(plot_spacer()+p1+plot_spacer()+
    plot_layout(widths = c(1,8,1)) #调节空白占位图和图A的宽度
 ) / (p2+p3+p4)

# 相当于plot_spacer()这个函数添加了一个补丁,
# 也就是整张图的上方画了一张空白补丁和一张p1和一张空白补丁,
# 然后用plot_layout()对上方进行比例的设定。下方则是p2、p3、p4

在这里插入图片描述

"cowplot"包中plot_grid()函数用于组合图形

library(ggplot2)
library(cowplot)
A <- ggplot(iris, aes(x = Sepal.Length,
y = Petal.Length, colour = Species)) +
  geom_point(size=2.5)

B <- ggplot(diamonds, aes(clarity, fill = cut)) +
  geom_bar() +
  theme(axis.text.x = element_text(angle=45, vjust=0.5, color = "black"),
        axis.text.y = element_text(color = "black"))
?plot_grid()
C <- plot_grid(A, B, labels = c("A", "B"))
C

绘制结果如下:
在这里插入图片描述
也可以按行排列:

plot_grid(A, B, labels = c("A", "B"), nrow = 2)

在这里插入图片描述
还可以根据自己的需求设置一个合理地布局,你也可以精确地指定布局画多少行多少列。

plot_grid(A, NULL, B, A, NULL, B,
          labels = c("A", "B", "C", "D", "E", "F"), nrow = 2, ncol = 3)

在这里插入图片描述

"customLayout"包,包含几个常用函数

创建并组合布局:lay_new();预览当前布局:lay_show();拼接图形:lay_bind_col()。

#加载所需要的R包
library(customLayout)
library(magrittr)

#查看函数用法
?lay_new()

#mat说明各图形位置的矩阵,是4张图并设置为2列2行布局
lay <- lay_new(
  mat = matrix(1:4, ncol = 2),
  widths = c(3, 2),
  heights = c(2, 1))
#左宽度占整图的3份,右宽度占2份
#上方高度占2份,下占1份

lay_show(lay) #查看当前布局

在这里插入图片描述
再尝试一个布局(需要注意的是,widths针对的是ncol的数量,而heights针对的是nrow的数量):

lay2 = lay_new(matrix(1:6, nrow = 3, ncol=2),
widths = c(1,1))

lay_show(lay2)

在这里插入图片描述
接着,学习一下拼接代码:

lay3 <- lay_bind_col(lay, lay2, widths = c(2,2 ))
lay_show(lay3)

#初始化绘图区域
lay_set(lay3)

#在设置好的绘图区域中添加图
plot(1:100 + rnorm(100))
plot(rnorm(100), type = "l")
hist(rnorm(500))
acf(rnorm(100))
pie(c(3, 4, 6), col = 2:4)
pie(c(3, 2, 7), col = 2:4 + 3)
pie(c(5, 4, 2), col = 2:4 + 6)
pie(c(3, 4, 6), col = 2:4)
pie(c(3, 2, 7), col = 2:4 + 3)
pie(c(5, 4, 2), col = 2:4 + 6)

在这里插入图片描述
在这里插入图片描述

R语言拼图的个人感悟和建议

  • 如果是需求较少,只是为了把所绘制的图形拼到一起,用patchwork包比较方便,因为该包不需要任何函数,把绘制的图直接按顺序拼凑在一起就可以。
  • 如果是需求比较多,比如要突出重点的图,或者按比例大小调节的。可以使customLayout包中的lay_new()函数。
  • 要熟悉不同函数对行列或者长宽的命令语法,特别是在customLayout中,widths针对ncol的数量(比如:ncol=3,那么widths=c(1,1,1)),heights针对nrow的数量。
  • 这些拼图包都可以与ggplot2包联用,我们还可以再用上export包,将绘制好的图拼好,再利用export包中graph2ppt函数将其以PPT格式导出,第一可以减小图片占用太多的内存(投稿时候对每张图的大小是有要求的,一般不超过3-5M),第二可以保证图片的清晰度(因为可以转化成pdf矢量图),第三方便日后对图进行微调和修改,第四可以少学几个软件(PS、AI)。
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷在前行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值