【问题标题】:How do I plot species as different colours in a point pattern (ppp) using spatstat in R?如何使用 R 中的 spatstat 将物种绘制为点模式 (ppp) 中的不同颜色?
【发布时间】:2018-05-04 01:29:09
【问题描述】:

设置如下:森林中 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,因为直径测量单位为厘米,样方大小以米为单位。

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

现在我想让不同物种的圆圈颜色不同,但这就是我卡住的地方。

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

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

如何在绘制点按比例绘制点的同时,使用同一字符的不同颜色来表示不同的物种?

我怎样才能让它产生 1 个单图?

提前谢谢你。

【问题讨论】:

    标签: r plot ggplot2 spatstat ppp


    【解决方案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])
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        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!

        【讨论】:

        • 我一直在与 Rolf Turner 讨论这个问题,并在此处复制了他的代码,作为对使用多个物种并插入图例的新问题的回答:stackoverflow.com/questions/69864435/…快乐绘图!
        • 抱歉,这在spatstat 的未来版本中将不起作用。此代码利用了当前spatstat 代码中的一个错误,该错误将很快关闭。您很快就需要使用基本图形来绘制此图。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        相关资源
        最近更新 更多