如何使用 R 中的 spatstat 在点模式 (ppp) 中将物种绘制为不同颜色?
How do I plot species as different colours in a point pattern (ppp) using spatstat in R?
设置是这样的:森林中 20 x 20 米的样方内有 10 棵树。对于每棵树,我们知道种类、直径(以厘米为单位)以及使用 x,y 坐标在样方内的位置。
我想绘制样方内的树木,其中点的大小按比例缩放,每个物种由不同的色圈表示。
使用此数据作为示例:
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,因为直径测量值以厘米为单位,样方大小以米为单位定义。
plot(species_map, which.marks=2, markscale=.01)
现在我想让不同物种的圆圈有不同的颜色,但这是我卡住的地方。
如果我尝试制作一个包含我的两个标记的图,我只会得到 2 个单独的图,一个使用不同的大小点来表示直径(正确),另一个使用不同的字符来表示不同的物种。
plot(species_map, which.marks= c(1,2), markscale=.01)
我怎样才能得到这个图来代表不同的物种,使用相同字符的不同颜色,同时绘制点以按比例绘制?
我怎样才能让它产生 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])
}
多列标记的符号映射尚未在 spatstat
中实现。所以你需要像 Ege 建议的那样做。
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)
library(spatstat)
Dat <- data.frame(x,y,species, diameter)
X <- as.ppp(Dat,W=square(20))
marks(X)$species <- factor(marks(X)$species)
ccc <- c("red","green","blue","black")[as.numeric(marks(X)$species)]
plot(X,which.marks="diameter",maxsize=1,main="Elegant?")
plot(X,which.marks="diameter",maxsize=1,bg=ccc,add=TRUE)
#感谢@RolfTurner!
设置是这样的:森林中 20 x 20 米的样方内有 10 棵树。对于每棵树,我们知道种类、直径(以厘米为单位)以及使用 x,y 坐标在样方内的位置。
我想绘制样方内的树木,其中点的大小按比例缩放,每个物种由不同的色圈表示。
使用此数据作为示例:
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,因为直径测量值以厘米为单位,样方大小以米为单位定义。
plot(species_map, which.marks=2, markscale=.01)
现在我想让不同物种的圆圈有不同的颜色,但这是我卡住的地方。
如果我尝试制作一个包含我的两个标记的图,我只会得到 2 个单独的图,一个使用不同的大小点来表示直径(正确),另一个使用不同的字符来表示不同的物种。
plot(species_map, which.marks= c(1,2), markscale=.01)
我怎样才能得到这个图来代表不同的物种,使用相同字符的不同颜色,同时绘制点以按比例绘制?
我怎样才能让它产生 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])
}
多列标记的符号映射尚未在 spatstat
中实现。所以你需要像 Ege 建议的那样做。
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)
library(spatstat)
Dat <- data.frame(x,y,species, diameter)
X <- as.ppp(Dat,W=square(20))
marks(X)$species <- factor(marks(X)$species)
ccc <- c("red","green","blue","black")[as.numeric(marks(X)$species)]
plot(X,which.marks="diameter",maxsize=1,main="Elegant?")
plot(X,which.marks="diameter",maxsize=1,bg=ccc,add=TRUE)
#感谢@RolfTurner!