问题描述
我正在尝试使用 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)