Patchwork无法识别含ggMarginal分布元素的绘图对象,添加边缘分布后无法拼接绘图
问题原因与解决方案
这问题我之前也踩过坑!核心问题在于:ggMarginal()返回的不是ggplot对象——它输出的是gtable(grid table)类型的图形对象,而Patchwork的+运算符只支持拼接原生ggplot对象,直接用p1m + p2m自然会抛出「非数值参数给二元运算符」的错误。
你可以验证一下对象类型:
class(p1) # 返回 "gg" "ggplot" class(p1m) # 返回 "gtable" "gTree" "grob" "gDesc"
下面给两种可行的解决方法:
方法1:用gridExtra包拼接gtable对象
既然p1m和p2m是gtable,我们可以用gridExtra::grid.arrange()来实现并排显示:
library(gridExtra) # 按2列排列两个图形 grid.arrange(p1m, p2m, ncol = 2)
方法2:把gtable转成ggplot对象,适配Patchwork
如果一定要用Patchwork的语法,我们可以把gtable包装成ggplot的annotation_custom,这样就能用+拼接了:
# 定义一个转换函数 gtable_to_ggplot <- function(gtable_obj) { ggplot() + annotation_custom(grob = gtable_obj, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) + theme_void() # 去掉默认的坐标轴等元素 } # 转换两个带边缘分布的图形 p1m_gg <- gtable_to_ggplot(p1m) p2m_gg <- gtable_to_ggplot(p2m) # 现在可以正常用Patchwork拼接了 p1m_gg + p2m_gg
两种方法都能实现你要的并排显示效果,看你更习惯哪种工具链~
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

