如何制作带有整体误差条的堆积条形图?
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 日创建
我想制作一个与此类似的条形图,来自
我试过了
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 日创建