有没有办法将来自 Spatstat 的 K 函数的绘图转换为 ggplot 或 grob?

问题描述

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

kk1plot<-plot(Kest(landscape))

但是,当我尝试使用时,我返回错误“无法将类 data.frame 的对象转换为 grob”:

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

同样,当我使用拼凑和代码时,我返回错误“只知道如何添加 ggplots 和/或 grobs”:

k1<-wrap_plots(list(kk1plot,kk5plot),ncol=2)

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

解决方法

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.panel = "")

,

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

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

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

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) 

enter image description here