如何制作带有整体误差条的堆积条形图?

How to make a stacked bar chart with overall error bar?

我想制作一个与此类似的条形图,来自 https://www.nature.com/articles/s41893-019-0415-y

我试过了

ggplot(diamonds) +  
  geom_bar(aes(clarity, fill=color,
             ymin=count-sd(count), 
             ymax=count+sd(count))) +
  geom_errorbar( position = "identity", colour="black") 

但返回错误:Warning: Ignoring unknown aesthetics: ymin, ymax Error in as.double(x) : cannot coerce type 'closure' to vector of type 'double'

分别计算 count 和它的 sd 没有帮助。

head(diamonds %>%
  group_by(color, clarity) %>%
  summarize(count = n(), 
            sd_count = sd(count)), 10)

# A tibble: 10 × 4
# Groups:   color [2]
   color clarity count sd_count
   <ord> <ord>   <int>    <dbl>
 1 D     I1         42       NA
 2 D     SI2      1370       NA
 3 D     SI1      2083       NA
 4 D     VS2      1697       NA
 5 D     VS1       705       NA
 6 D     VVS2      553       NA
 7 D     VVS1      252       NA
 8 D     IF         73       NA
 9 E     I1        102       NA
10 E     SI2      1713       NA

这段代码给出了一个完美的堆叠条形图,没有错误条。

ggplot(diamonds) +  
  geom_bar(aes(clarity, fill=color)) 

非常感谢任何帮助修复我的代码的线索。

问题是 geom_bar 正在为您构建直方图,因此无法访问数据框中的所有其他列。这里我使用geom_col自己构建直方图,包括计算每组的总计数和标准差。

另一个选项(df2,下面的第二个图)是用 summarize 替换 mutate,并将其作为单独的数据帧传递给 geom_errorbar(并且保留你的 geom_bar)。我更喜欢这个,因为它只为每个条绘制一次错误条,而不是为每种颜色透支它们。

library(dplyr, warn.conflicts = FALSE)
library(ggplot2)

df <- diamonds %>% group_by(clarity, color) %>% 
    summarize(count = n()) %>% 
    group_by(clarity) %>% 
    mutate(sd = sqrt(var(count)), count_total = sum(count)) %>% 
    ungroup()
#> `summarise()` has grouped output by 'clarity'. You can override using the `.groups` argument.

ggplot(df, aes(clarity, y=count, fill=color, ymin=count_total-sd, ymax = count_total+sd)) +  
    geom_col()+
    geom_errorbar()

df2 <- diamonds %>% group_by(clarity, color) %>% 
    summarize(count = n()) %>% 
    group_by(clarity) %>% 
    summarize(sd = sqrt(var(count)), count_total = sum(count)) %>% 
    ungroup()           
#> `summarise()` has grouped output by 'clarity'. You can override using the `.groups` argument.

ggplot(diamonds, aes(clarity, fill=color)) +  
    geom_bar()+
    geom_errorbar(data = df2, aes(clarity, ymin=count_total-sd, ymax = count_total+sd), inherit.aes = FALSE)

reprex package (v2.0.1)

于 2021 年 10 月 10 日创建