同一图中不同密度曲线(分组因子)下的阴影区域

时间:2020-10-06 14:01:25

标签: r ggplot2

我正在尝试绘制一条密度线,并且只想阴影或填充与x轴的95%相关的区域。我试图遵循所附答案中给出的答案,但是当我们使用分组因子同时绘制多个分布时,没有一个人提到对区域着色。在这种情况下,分组因子是不同的中心电极(“ Fz”,“ Cz,” Pz“),我试图显示类似于最高密度区间的东西,或者曲线下的面积在5到95之间。

Area Under Curve AUC by Group

我的数据如下所示:

> 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")

我绘制了与我要寻找的东西类似的东西

skribble of desired outcome

我当然可以使用bayestestR HDI标准输出,但我更喜欢ggplot的美观性和灵活性。

任何帮助将不胜感激。

1 个答案:

答案 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)) 

enter image description here