我们接着来唠唠R 的grid 绘图。gridExtra
包人如其名,拓展包,自然就是要拓展的。
之前我们说过,ggplot 和base 都有自己的拼图方案:[[88-R可视化20-R的几种基于ggplot的拼图解决方案]]。
而在[[96-R可视化25-底层绘图系统grid学习之viewports]] 中,我们也说过,可以通过调整不同的viewport,实现同一大画布下,整合多个不同的grid 元素。亦或你也可以直接利用整体坐标来分配grob 对象,只是这样自然会有些麻烦。
gridExtra 拓展就比较方便了,可以自动的调配区域:
grid.arrange(linesGrob(), circleGrob(),
roundrectGrob(), segmentsGrob(),
ncol = 2)
不过需要注意的是,grid.arrange
函数在调用的时候会重新开启一个新的画布。
因为ggplot2 其实就是grob 对象的ggplotGrob 组合,所以对于ggplot 对象,也是同样适用的。
如果你还记得[[88-R可视化20-R的几种基于ggplot的拼图解决方案]] 的话,其中提到了design 参数:
design <- "
122
1#3
443
"
p1 + p2 + p3 + p4
类似的,在grid.arrange 里,你可以通过参数layout_matrix 进行调配:
grid.arrange(rectGrob(), circleGrob(),
roundrectGrob(), textGrob(label = "good"),
layout_matrix = matrix(c(1,1,NA,2,3,3,4,NA),
ncol = 4, byrow = T))
> matrix(c(1,1,NA,2,3,3,4,NA),
+ ncol = 4, byrow = T)
[,1] [,2] [,3] [,4]
[1,] 1 1 NA 2
[2,] 3 3 4 NA
这个matrix 内容,即对应了图中的位置:
以及通过tableGrob()
画表格,其实[[43-R可视化01-gt包让R制作漂亮的表格]] 中的表格更好看哦:
iris_plot <- ggplot(iris, aes(x = Sepal.Length,
y = Sepal.Width, color = Species)) +
geom_point()
iris_table <- iris %>%
group_by(Species) %>%
dplyr::summarize(`Average Sepal.Length` = round(mean(Sepal.Length), 1),
`Average Sepal.Width` = round(mean(Sepal.Width), 1)) %>%
tableGrob()
grid.draw(ggplotGrob(iris_plot))
wc_table_vp <- viewport(x = 0.22, y = 0.85,
just = c("left", "top"),
height = 0.1, width = 0.2)
pushViewport(wc_table_vp)
grid.draw(iris_table)
popViewport()
可以参考:Index of /web/packages/gridExtra/vignettes (r-project.org)[4]
里面有几个函数的较为详细的用法介绍:
[1]
4.5 The grid Package | Mastering Software Development in R (bookdown.org): https://bookdown.org/rdpeng/RProgDA/the-grid-package.html#overview-of-grid-graphics
[2]
R实战:grid包 - 悦光阴 - 博客园 (cnblogs.com): https://www.cnblogs.com/ljhdo/p/4874785.html
[3]
(11条消息) R语言grid包使用笔记——viewport_数据之美-CSDN博客_r语言grid包: https://blog.csdn.net/vivihe0/article/details/47188329
[4]
Index of /web/packages/gridExtra/vignettes (r-project.org): https://cran.r-project.org/web/packages/gridExtra/vignettes/