ggtern与ggsave/ggpubr兼容报错:CoordTern缺失z美学如何解决?
解决ggtern图与ggsave/ggarrange配合时的"CoordTern requires z aesthetics"报错问题
报错原因
这个错误的核心在于ggtern生成的三元图是基于ggplot2的扩展,但它使用了特殊的CoordTern坐标系统,这个系统强制要求存在z美学映射。而ggplot2::ggsave和ggpubr::ggarrange这两个函数最初是为标准的ggplot2笛卡尔坐标图设计的,在处理ggtern对象时,它们内部的绘图上下文重建逻辑没有正确保留或识别三元图所需的z美学信息,从而触发了这个报错。
针对ggsave的解决方法
你可以绕过ggsave,直接使用base R的绘图设备来保存ggtern图,这种方式会直接渲染并保存绘图对象,不会做额外的坐标校验:
# 打开png设备 png(paste0('ternary plot','.png'), width=30, height=25, units='cm', res=600) # 打印绘图对象 print(plot) # 关闭设备 dev.off()
如果一定要用ggsave,也可以尝试在调用时明确传递plot对象的打印结果,但上面的base R方法更稳定可靠。
针对ggarrange的解决方法
要组合ggtern图和普通ggplot图,推荐使用更底层的gridExtra::grid.arrange,它可以直接处理绘图对象的grob(图形对象)结构,不会触发坐标校验问题:
library(gridExtra) library(ggplot2) # 创建一个示例普通ggplot图 ggplot_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() # 将两个绘图对象转换为grob tern_grob <- ggplotGrob(plot) ggplot_grob <- ggplotGrob(ggplot_plot) # 组合绘图 grid.arrange(tern_grob, ggplot_grob, ncol = 2)
如果坚持使用ggpubr::ggarrange,同样可以先将ggtern图转换为grob再传入,这样就能避开兼容性问题:
library(ggpubr) tern_grob <- ggplotGrob(plot) ggarrange(tern_grob, ggplot_plot, ncol = 2)
总结
本质上是ggtern的特殊坐标系统与通用ggplot2工具函数的兼容性问题,通过直接使用base R绘图设备保存,或者将绘图对象转换为grob后再进行组合,就能顺利解决这个报错。
内容的提问来源于stack exchange,提问作者Herman Toothrot
相关产品推荐
相关产品推荐

