有没有办法将从 Spatstat 的 K 函数导出的图转换为 ggplot 或 grob?

Is there a way to convert the plot derived from Spatstat's K function into a ggplot or grob?

我正在尝试使用 ggpubr 的 ggarrange 从 spatstat 创建 Ripley's K 函数的多个图,即我使用 Kest() 计算 Ripley's K 5 个景观,然后将它们一起绘制。如:

kk1plot<-plot(Kest(landscape))

然而,当我尝试使用 return 时出现错误“无法将 class data.frame 的对象转换为 grob”:

k1<-ggarrange(kk1plot,kk2plot,kk3plot,kk4plot,kk5plot,nrow=3,ncol=2) 

同样,当我使用 patchwork 和代码时,我 return 出现错误“只知道如何添加 ggplots and/or grobs”:

k1<-wrap_plots(list(kk1plot,kk2plot,kk3plot,kk4plot,kk5plot),nrow=3,ncol=2)

谁知道我如何将多个 Ripley's K 函数的输出绘制为一个图?即,将 spatstat 的 Kest() 的输出转换为可以使用上述代码行之一进行操作的图?

一种方法是使用 ggplotify::as.grob 将绘图捕获为 grob 对象。

然后您可以使用 ggpubr::ggarange 绘制它。

正确的语法是 as.grob(~ ...) 用 plot 函数替换 ...

library(ggplotify)
library(ggpubr)
library(spatstat)
for(i in 1:5){
  varname <- paste0("kk",i,"plot")
  assign(varname,
         as.grob(~plot(Kest(rMatClust(kappa=5,r=0.1,mu=100)),
                       main = paste("Plot",i),
                       cex.axis = 0.5, cex.main = 0.6,
                       legendargs = list(cex = 0.2)))
  )
}
ggarrange(kk1plot,kk2plot,kk3plot,kk4plot,kk5plot,nrow=3,ncol=2) 

spatstat 包使用基本图形。绘制多个的内置方式 估计的 K 函数如下所示。 Kest 的返回输出是一个 data.frame,具有不同的估计值 列,以便您可以自己使用相关美学使用 ggplot 绘制它。

library(spatstat)
X1 <- rpoispp(100)
X2 <- rpoispp(100)
X3 <- rpoispp(100)
X4 <- rpoispp(100)
X5 <- rpoispp(100)
Xlist <- solist(X1, X2, X3, X4, X5)
plot(Xlist, main = "", main.panel = "")

Klist <- lapply(Xlist, Kest)
Klist <- as.anylist(Klist)
plot(Klist, main = "", main.panel = "")