如何使用R中的spatstat在点模式(ppp)中将物种绘制为不同的颜色?

时间:2017-11-20 18:19:01

标签: r plot ggplot2 spatstat ppp

设置如下:森林中20 x 20 m样方内有10棵树。对于每棵树,我们使用x,y坐标知道物种,直径(以cm为单位)和样方内的位置。

我想绘制样方中的树,其中点的大小是按比例缩放的,每个物种都用不同的颜色圆圈表示。

使用此数据作为示例:

tag <- as.character(c(1,2,3,4,5,6,7,8,9,10))

species <- c("A","A","A","A","B","B","B","C","C","D")

diameter <- c(50,20,55,30,30,45,15,20,35,45)

x <- c(9,4,5,14,8,19,9,12,10,2)

y <- c(6,7,15,16,12,4,19,2,14,9)

df <- data.frame(tag, species, diameter, x, y)

首先我创建点模式

species_map <- ppp(df$x, df$y, c(0,20), c(0,20))

然后我标记物种和直径

marks(species_map) <- data.frame(m1 = df$species, m2=(df$diameter))

现在我可以绘制点图案,并且由于直径上的标记,每个点都可以缩放。 “markscale”位设置为0.01,因为diamter测量值以cm为单位,quadrat尺寸以米为单位定义。

plot(species_map, which.marks=2, markscale=.01)

现在我想让不同种类的圈子变成不同的颜色,但这就是我被困住的地方。

如果我尝试制作包含我的两个标记的图,我只得到2个单独的图,其中一个使用不同大小的点来表示直径(正确),一个使用不同的字符来表示不同的物种。

plot(species_map, which.marks= c(1,2), markscale=.01)

如何使用相同字符的不同颜色来表示不同物种的情节,同时还要绘制按比例绘制的点?

我怎样才能让它产生一个单一的情节?

提前谢谢。

2 个答案:

答案 0 :(得分:1)


奇怪的是,我无法想到一个非常优雅的方式来做到这一点。我的 最好的办法是按物种将数据分成不同的点模式 并循环通过物种和情节。这对你来说够了吗?

library(spatstat)
tag <- as.character(c(1,2,3,4,5,6,7,8,9,10))
species <- c("A","A","A","A","B","B","B","C","C","D")
diameter <- c(50,20,55,30,30,45,15,20,35,45)
x <- c(9,4,5,14,8,19,9,12,10,2)
y <- c(6,7,15,16,12,4,19,2,14,9)
df <- data.frame(tag, species, diameter, x, y)
species_map <- ppp(df$x, df$y, c(0,20), c(0,20))
marks(species_map) <- data.frame(m1 = df$species, m2=(df$diameter))

您需要选择四种颜色并固定相同的直径范围 每个情节和做循环(argumet bg传递给symbols和 用这种颜色填充圆圈的背景:

diamrange <- range(diameter)
cols <- c("black", "red", "green", "blue")
species_map_split <- split(species_map, reduce = TRUE)
plot(species_map_split[[1]], markrange = diamrange, markscale=.01,
     main = "", cols = cols[1], bg = cols[1])
#> Warning: Interpretation of arguments maxsize and markscale has changed (in
#> spatstat version 1.37-0 and later). Size of a circle is now measured by its
#> diameter.
for(i in 2:4){
  plot(species_map_split[[i]], markrange = diamrange, markscale=.01,
       add = TRUE, col = cols[i], bg = cols[i])
}

答案 1 :(得分:1)

spatstat尚未实现多列标记的符号映射。所以你需要像Ege所做的那样做。