【问题标题】:Creating species abundance curves with geom_area or geom_density使用 geom_area 或 geom_density 创建物种丰度曲线
【发布时间】:2016-04-14 00:16:02
【问题描述】:

我正在尝试创建一个图表,显示随着时间的推移物种的丰度。 我希望最终的图表看起来像使用 geom_density 生成的东西,每个物种都有平滑的曲线。例如,此站点上的图 1 (Figure 1)。但是,我无法操纵 R 使用我的 y 值(丰度)而不是密度计数。 我确实设法使用了 geom_area,但这并不是我真正想要的输出。 有谁知道如何让 geom_density 接受 y 值?或者,用平滑曲线绘制物种丰度?

例子:

data.set <- data.frame(
  Time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
  Type = rep(c('a', 'b', 'c', 'd'), 4),
  Value = rpois(16, 10)
)

Value 是物种丰度,Time 是记录每个丰度的时间点,Type 代表四种不同的物种。

ggplot(data.set, aes(Time, Value)) + geom_area(aes(fill = Type))

一旦绘制出来,它就非常“矮胖”。我更喜欢使用 geom_density 之类的东西来制作平滑曲线,然后使用 alpha 使它们透明。

任何帮助将不胜感激!

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    您可以使用spline() 进行插值(根据this 2010 年的回答)

    library(ggplot2)
    library(data.table) #for rbindlist
    
    # break data.frame into chunks by type
    type_chunks <- split(data.set, data.set$Type)
    
    # apply spline function to each chunk
    spline_chunks <- lapply(seq_along(type_chunks), function(i) {
      x <- type_chunks[[i]]
      data.frame(Type=names(type_chunks)[i],
                 spline(x$Time, x$Value, n=50)) # choose a value for n
    })
    
    # crush chunks back to one data.frame
    spline_df <- rbindlist(spline_chunks)
    
    # original plot
    ggplot(data.set, aes(Time, Value)) + geom_line(aes(color = Type), size=2)
    
    # plot smoothed version
    ggplot(spline_df, aes(x, y)) + geom_line(aes(color = Type), size=2)
    

    原图

    平滑版

    请注意,我将这些绘制为线图,而不是面积图,因为它与您链接的帖子相匹配,并且面积图将系列显示为堆叠而不是独立。

    【讨论】:

    • 另外,我确信@hrbrmstr 很快就会发布关于geom_xspline 的信息,但这需要安装另一个包:github.com/hrbrmstr/ggalt
    【解决方案2】:

    有趣的是,如果数据集没有汇总,您可以使用stat_density

    根据Value 中汇总的计数扩展这样的简单数据集非常容易,您可以在其中根据Value 添加行。查看选项here

    # Make expanded dataset
    d2 = data.set[rep(row.names(data.set), data.set$Value), 1:2]
    head(d2)
    
        Time Type
    1      1    a
    1.1    1    a
    1.2    1    a
    1.3    1    a
    1.4    1    a
    1.5    1    a
    

    然后您可以使用..count..y 美学制作所需的情节。您可以制作密度图,也可以使用stat = "density" 制作线图。这是后者的一个例子。

    ggplot(d2, aes(Time, y = ..count.., color = Type)) +
        geom_line(size = 1, stat = "density")
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2021-04-14
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多