R语言中如何将grViz转为ggplot2对象?解决patchwork组合报错
问题解答
核心结论
grViz属于htmlwidget类对象,和ggplot2的ggplot对象底层实现逻辑完全不同,无法直接转换为ggplot2对象。patchwork仅支持ggplot2对象或兼容grid体系的图形组合,直接拼接grViz报错就是因为类型不匹配。
可行的图形组合方案
方案1:导出grViz为静态图片后导入ggplot2
先把grViz图形导出为PNG/SVG这类静态图片,再用ggplot2的工具把图片包装成ggplot对象,就能用patchwork正常组合了。示例代码:
library(DiagrammeR) library(ggplot2) library(magrittr) library(patchwork) library(grid) library(png) # 生成grViz图形 "digraph G { A -> B }" %>% grViz -> plt.grviz # 先安装依赖包webshot2(用于导出htmlwidget为图片) # install.packages("webshot2") # 若浏览器缺失,运行webshot2::install_chromium()配置 webshot2::webshot(plt.grviz, "grviz_plot.png") # 将图片转为grid图形对象 grviz_grob <- rasterGrob(readPNG("grviz_plot.png")) # 把grViz图片包装成ggplot对象 plt.grviz.gg <- ggplot() + annotation_custom(grviz_grob, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) + theme_void() # 生成原ggplot图形 plt.mcars <- ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() # 用patchwork组合 plt.mcars + plt.grviz.gg
方案2:用grid包直接布局组合
不用转成ggplot对象,直接用grid的布局系统把两个图形拼在一起:
library(grid) # 把ggplot转为grob对象 ggplot_grob <- ggplotGrob(plt.mcars) # 读取之前导出的grViz图片grob grviz_grob <- rasterGrob(readPNG("grviz_plot.png")) # 新建画布并布局 grid.newpage() pushViewport(viewport(layout = grid.layout(1, 2))) print(ggplot_grob, vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) print(grviz_grob, vp = viewport(layout.pos.row = 1, layout.pos.col = 2))
注意事项
- 如果导入SVG时报错,大概率是SVG格式存在兼容性问题,建议改用PNG格式导出,适配性更强;
webshot2依赖Chrome/Chromium浏览器,首次使用若报错,执行webshot2::install_chromium()即可自动配置。
内容的提问来源于stack exchange,提问作者moneykonkey
相关产品推荐
相关产品推荐

