使用geom_area或geom_density创建物种丰度曲线

时间:2016-04-14 00:16:03

标签: r plot ggplot2

我正在尝试创建一个图表,显示随着时间的推移物种的丰富程度。 我希望最终的图形看起来像使用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)
)

当价值是物种丰富时,时间是记录每个丰度的时间点,而类型代表四种不同的物种。

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

一旦绘制,它就会非常“粗糙”。我更喜欢使用像geom_density这样的东西来制作平滑的曲线,然后使用alpha来使它们透明。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

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)

原始情节 enter image description here

平滑版 enter image description here

注意我将这些作为线图,而不是区域图,因为它与您链接的帖子匹配,并且区域图显示系列为堆叠而非独立。

答案 1 :(得分:0)

Interestingly, this is a case where you could use stat_density if the dataset wasn't summarized.

It's pretty easy to expand a simple dataset like this based on the counts summarized in Value, where you add rows based on Value. See options 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

Then you can make the desired plot using ..count.. for the y aesthetic. You can make density plots, or you can make line plots using stat = "density". Here is an example of the latter.

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

enter image description here