我正在尝试创建一个图表,显示随着时间的推移物种的丰富程度。 我希望最终的图形看起来像使用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来使它们透明。
任何帮助将不胜感激!
答案 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)
注意我将这些作为线图,而不是区域图,因为它与您链接的帖子匹配,并且区域图显示系列为堆叠而非独立。
答案 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")