在[[111-R可视化35-结合grid与ggplot输出]] 与[[116-R可视化36-把你长长的坐标轴弄短]] 中,我们提过:通过pushViewport
控制画布位置的方法,我们可以画出:
但美中不足的一点是,因为其并非是在一个ggplot 图层上操作,就没有办法使用ggsave
的方法了。
忽然发现,其实cowplot 和patchwork 也有对应的函数。
p_load(ggplot2, patchwork, cowplot)
p1 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width))
p2 <- ggplot(iris) + geom_boxplot(aes(Species, Sepal.Length))
也就对应包里的两个函数:
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1)
ggdraw(p1) + draw_plot(p2, x = .6, y = .6,
width = .4, height = .4)
另外,可以对比一下它们在0,0 原点作图的结果:
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则似乎只有坐标系的底部是与原图贴合,而左侧并没有完全贴合。
虽然在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. ”
> class(pp_patch)
[1] "patchwork" "inset_patch" "gg" "ggplot"
> class(pp_cow)
[1] "gg" "ggplot"
在[[108-R可视化32-通过seurat包中的LabelClusters学习ggplot之一]] 我就探索过cowplot 与patchwork 拼图后的对象。
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 的风格一致,比如:
pp <- p1 + p2 + p3
pp$patches$plots[[1]] + pp$patches$plots[[2]]
patches 存放的也是p1 与p2。
简单的摸索了一下,发现还是缺乏对ggplot 对象的理解,留给以后深挖了。
因为是ggplot 对象,就可以用ggsave了:
> 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