前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >122-R可视化40-以ggplot对象的形式进行图层叠加

122-R可视化40-以ggplot对象的形式进行图层叠加

作者头像
北野茶缸子
发布2022-04-05 15:45:32
1.5K0
发布2022-04-05 15:45:32
举报
文章被收录于专栏:北野茶缸子的专栏
  • 参考:
    • Controlling Layouts • patchwork (data-imaginist.com)[1]
    • Drawing with and on plots • cowplot (wilkelab.org)[2]

前言

在[[111-R可视化35-结合grid与ggplot输出]] 与[[116-R可视化36-把你长长的坐标轴弄短]] 中,我们提过:通过pushViewport控制画布位置的方法,我们可以画出:

但美中不足的一点是,因为其并非是在一个ggplot 图层上操作,就没有办法使用ggsave 的方法了。

忽然发现,其实cowplot 和patchwork 也有对应的函数。

代码语言:javascript
复制
p_load(ggplot2, patchwork, cowplot)

p1 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width))
p2 <- ggplot(iris) + geom_boxplot(aes(Species, Sepal.Length))

简单插入

也就对应包里的两个函数:

  • patchwork: inset_element
  • cowplot: draw_plot
代码语言:javascript
复制
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1)
代码语言:javascript
复制
ggdraw(p1) + draw_plot(p2, x = .6, y = .6,
               width = .4, height = .4)

另外,可以对比一下它们在0,0 原点作图的结果:

代码语言:javascript
复制
pp_patch <- p1 + inset_element(p2, left = 0, bottom = 0, right = .4, top = .4)

pp_cow <- ggdraw(p1) + draw_plot(p2, x = 0, y = 0,
               width = .4, height = .4)
  • patchwork
  • cowplot

可见,patchwork 是严格的控制在坐标系的范围内。而cowplot则似乎只有坐标系的底部是与原图贴合,而左侧并没有完全贴合。

虽然在draw_plot 方法中写道:

★Places a plot somewhere onto the drawing canvas. By default, coordinates run from 0 to 1, and the point (0, 0) is in the lower left corner of the canvas. ”

再看看两个对象差别

代码语言:javascript
复制
> class(pp_patch)
[1] "patchwork"   "inset_patch" "gg"          "ggplot"     
> class(pp_cow)
[1] "gg"     "ggplot"

在[[108-R可视化32-通过seurat包中的LabelClusters学习ggplot之一]] 我就探索过cowplot 与patchwork 拼图后的对象。

代码语言:javascript
复制
pp <- p1 + p2
pp2 <- plot_grid(p1,p2)
> class(pp)
[1] "patchwork" "gg"        "ggplot"   
> class(pp2)
[1] "gg"     "ggplot"

对于patchwork 来说,inset_element 依旧是将其他拼图部分放在了pp_patch$patches,我们直接调用,会将拼图部分打印出来。

有意思的是,这里打印的结果并非是insert 部分,也就是说,patches 部分实际存放的是背景部分的“主图”:

不过这也和patchwork 的风格一致,比如:

代码语言:javascript
复制
pp <- p1 + p2 + p3

pp$patches$plots[[1]] + pp$patches$plots[[2]]

patches 存放的也是p1 与p2。

简单的摸索了一下,发现还是缺乏对ggplot 对象的理解,留给以后深挖了。

能用ggsave 了

因为是ggplot 对象,就可以用ggsave了:

代码语言:javascript
复制
> class(pp_patch)
[1] "patchwork"   "inset_patch" "gg"          "ggplot"     
> class(pp_cow)
[1] "gg"     "ggplot"

ggsave(filename = "cow.pdf", plot = pp_cow)
ggsave(filename = "patch.pdf", plot = pp_patch)

可喜可贺。

参考资料

[1]

Controlling Layouts • patchwork (data-imaginist.com): https://patchwork.data-imaginist.com/articles/guides/layout.html#insets-1

[2]

Drawing with and on plots • cowplot (wilkelab.org): https://wilkelab.org/cowplot/articles/drawing_with_on_plots.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 简单插入
  • 再看看两个对象差别
  • 能用ggsave 了
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档