将分位数添加到每一行,ggplot2

Add the quantilies to each line, ggplot2

我试图在这个具有三条线的图表上遮蔽 0.025 和 0.975 分位数。我试过 geom_area、geom_ribbon,但我无法突出显示每一行中的每个分位数。

请注意,此密度图中忽略了“y”。

example <-data.frame(source=c("Leaflitter","Leaflitter","Leaflitter","Leaflitter", 
"Leaflitter","Leaflitter","Leaflitter","Leaflitter","Leaflitter","Leaflitter",
"Biofilm","Biofilm","Biofilm","Biofilm","Biofilm","Biofilm","Biofilm","Biofilm",
"Biofilm","Biofilm","Algae","Algae","Algae","Algae","Algae","Algae","Algae","Algae",
"Algae","Algae"), n=c(1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10),
density=c(0.554786934, 0.650578421, 0.039317168, 0.53537613,0.435081982,0.904056941,0.556284164,0.855319434,
0.399169622,0.570246304,0.076722032,0.257427999,0.172736928,0.447424473,0.520976948,0.011720494,0.311348655,
         0.120698996,0.016336661,0.331741377,  0.368491034,0.09199358,0.787945904,0.017199397,0.04394107,
0.084222564,0.132367181,0.023981569,0.584493716,0.098012319))

example

一个子组和分位数

L <- filter(QPA_G_Feb17, source == "Leaflitter")
L <-as.data.frame(L)

Lq025  <- quantile(L$density, .025)
Lq975  <- quantile(L$density, .975)
ggplot(QPA_G_Feb17, aes(x=density, color=source)) + 
  labs(y="Density", x="Sorce contribution") +
  geom_density(aes(linetype = source), size=1.2) +
  scale_color_manual(values=c("#31a354", "#2c7fb8", "#d95f0e")) +
  scale_linetype_manual(values = c("solid", "dotted", "longdash")) +
  theme_classic()+
  ylim(0, 5)+
  theme(axis.text.y=element_text(angle=0, size=12, vjust=0.5, color="black")) +
  theme(axis.text.x =element_text(angle=0, size=12, vjust=0.5, color="black")) + 
  theme(axis.title.x = element_text(color="black", size=14))+ 
  theme(axis.title.y = element_text(color="black", size=14))  

感谢您的帮助,因为我查看了其他论坛,并且只有 1 行时有要突出显示的信息。

我认为这个数据更能代表你图中显示的数据:

set.seed(50)

QPA_G_Feb17 <- data.frame(density = c(rgamma(400, 2, 10), 
                                      rgamma(400, 2.25, 9),
                                      rgamma(400, 5, 7)),
                          source = rep(c("Algae", "Biofilm", "Leaflitter"), 
                                       each = 400))

我发现当您尝试在 ggplot 中尝试做一些复杂的事情或 non-standard 时,最好的办法是提前计算您希望绘制的数据。在这种情况下,我们可以计算密度曲线和累积密度,包括它们的 0.025 和 0.975 分位数,并将它们全部放在这样的数据框中:

dens <- lapply(split(QPA_G_Feb17, QPA_G_Feb17$source), 
               function(x) density(x$density, from = 0, to = 1))

df <- do.call(rbind, mapply(function(x, y) {
                             data.frame(x = x$x, y = x$y, source = y)
                            }, dens, names(dens), SIMPLIFY = FALSE))

df <- df %>% 
  group_by(source) %>%
  mutate(cdf = cumsum(y * mean(diff(x))),
         lower = cdf < 0.025,
         upper = cdf > 0.975) 

现在可以很容易地使用 geom_area 绘图:

ggplot(df, aes(x, y, color = source)) + 
  geom_area(data = df[df$lower,], aes(fill = source), alpha = 0.5,
            position = "identity") +
  geom_area(data = df[df$upper,], aes(fill = source), alpha = 0.5,
            position = "identity") +
  labs(y = "Density", x = "Source contribution") +
  geom_line(aes(linetype = source), size = 1.2) +
  scale_fill_manual(values = c("#31a354", "#2c7fb8", "#d95f0e")) +
  scale_color_manual(values = c("#31a354", "#2c7fb8", "#d95f0e")) +
  scale_linetype_manual(values = c("solid", "dotted", "longdash")) +
  theme_classic() +
  ylim(0, 5) +
  xlim(0, 1) +
  theme(axis.text.y  = element_text(size = 12, vjust = 0.5),
        axis.text.x  = element_text(size = 12, vjust = 0.5),  
        axis.title.x = element_text(size = 14),
        axis.title.y = element_text(size = 14)) 

这里,每条密度曲线的 2.5% 和 97.5% 极值在每条线下方都有阴影。例外情况出现在“Leaflitter` 线中,它明显超出了您示例中绘制的 0-1 范围。