我正在尝试绘制一条密度线,并且只想阴影或填充与x轴的95%相关的区域。我试图遵循所附答案中给出的答案,但是当我们使用分组因子同时绘制多个分布时,没有一个人提到对区域着色。在这种情况下,分组因子是不同的中心电极(“ Fz”,“ Cz,” Pz“),我试图显示类似于最高密度区间的东西,或者曲线下的面积在5到95之间。
我的数据如下所示:
> head(dframe1)
x y Electrode
1 1.571296 0.0001474116 Fz
2 1.576496 0.0001487649 Fz
3 1.581697 0.0001497564 Fz
4 1.586897 0.0001504074 Fz
5 1.592098 0.0001507446 Fz
6 1.597298 0.0001507776 Fz
此刻,我用于在ggplot中按组绘制分布的代码如下:
p1 <- ggplot(data = dframe1, mapping = aes(x = x, y = y)) +
geom_density_line(stat = "identity", size=.5, alpha=0.3, aes(color=Electrode, fill=Electrode)) +
scale_fill_discrete(breaks=c("Fz","Cz","Pz")) +
guides(colour = FALSE) +
geom_vline(xintercept = 0) +
xlab("values") +
xlim(-2, 10) +
ylab("density") +
ylim(0, .7) +
theme(axis.text=element_text(size=12),
axis.title=element_text(size=16),
plot.title = element_text(size=18)) +
labs(title="Interval")
我绘制了与我要寻找的东西类似的东西
我当然可以使用bayestestR HDI标准输出,但我更喜欢ggplot的美观性和灵活性。
任何帮助将不胜感激。
答案 0 :(得分:2)
由于您需要对密度曲线进行一些数学运算才能得出95%的间隔在哪里,因此最好在ggplot之外进行。我经常发现人们遇到问题是因为他们试图使ggplot过多地处理和汇总数据。通常,先确定要绘制的内容然后再绘制即可。
在您的情况下,您的x和y坐标已经代表了密度。对于每个电极,您只需要创建一个逻辑向量即可告诉您密度的积分何时介于0.025和0.975之间,以便您可以轻松地将95%的置信区间分为子集。您可以使用split-aplly-bind方法执行以下操作:
densdf <- do.call(rbind, lapply(split(dframe1, dframe1$Electrode), function(z)
{
integ <- cumsum(z$y * mean(diff(z$x)))
CI <- integ > 0.025 & integ < 0.975
data.frame(x = z$x, y = z$y, Electrode = z$Electrode[1], CI = CI)
}))
现在我们准备绘制:
ggplot(data = densdf, mapping = aes(x = x, y = y)) +
geom_area(data = densdf[densdf$CI,],
aes(fill = Electrode, color = Electrode),
outline.type = "full", alpha = 0.3, size = 1) +
geom_line(aes(color = Electrode), size = 1) +
scale_fill_discrete(breaks = c("Fz", "Cz", "Pz")) +
guides(colour = FALSE) +
geom_vline(xintercept = 0) +
geom_hline(yintercept = 0) +
lims(x = c(-2, 10), y = c(0, 0.7)) +
labs(title = "Interval", x = "values", y = "density") +
theme_bw() +
theme(axis.text = element_text(size = 12),
axis.title = element_text(size = 16),
plot.title = element_text(size = 18))