使用带有 grid.arrange 的 ggmultiplot 对象

use a ggmultiplot object with grid.arrange

我正在尝试使用 grid.arrange() 将线性回归图及其诊断图放入一个图中。为了创建诊断图,我打算使用 autoplot()

library(gridExtra)
library(ggplot2)

linearMod <- lm(dist ~ speed, data=cars)
qqp <- (autoplot(linearMod, which = 2)) # qqplot
rvf <- (autoplot(linearMod, which = 1)) # res vs fitted plot

grid.arrange(qqp, rvf, nrow = 2)

> Error in `$<-`(`*tmp*`, wrapvp, value = vp) : 
  no method for assigning subsets of this S4 class

显然,autoplot 创建了一个类型为 S4 的 ggmultiplot,但我找不到将其转换为 grob 的方法,这是使用 grid.arrange().

所必需的

我试过了:

library(ggplotify)
as.grob(qqp)
> Error in UseMethod("as.grob") : 
  no applicable method for 'as.grob' applied to an object of class "ggmultiplot"
as.grob(qqp@plots) # also failed...

有人知道解决办法吗?是否可以替代 autoplot 的诊断图或将其与其他图组合的任何其他方法?

感谢任何帮助!

autoplot class 对象调用 ggplot2

autoplot 正在创建一个 class 对象 ggmultiplot,其中包含您的 ggplot 格式的绘图。

> summary(qqp)
     Length       Class        Mode 
          1 ggmultiplot          S4 

但是,您必须调用此 ggplot 才能在 grid.arrange 中使用。使用您的示例,您可以执行类似的操作:

library(ggfortify)
library(gridExtra)
grid.arrange(qqp@plots[[1]], rvf@plots[[1]], nrow = 2)

使用ggplot2重新创建由autoplot

绘制的图

或者,您可以使用 dplyr(或其他方法)提取拟合值和残差值并直接获得 ggplot:

library(tidyverse)
library(gridExtra)
CARS <- cars[,c("speed","dist")] %>% mutate(Fitted = linearMod$fitted.values, Residual = linearMod$residuals)
a <- ggplot(CARS, aes(x = Fitted, y = Residual))+
  geom_point()+
  stat_smooth(se = FALSE)
b <- ggplot(CARS, aes(sample = dist)) + stat_qq() + geom_qq_line(linetype = "dashed")
grid.arrange(b,a, nrow = 2, ncol = 1)

希望能帮到您解决问题