我正在尝试生成一个带有误差条的堆积条形图,该误差条代表每个条形的总变异性。我不想使用闪避条形图,因为每个条形有 >10 个类别。
下面我有一些可重现示例的示例数据:
scenario = c('A','A','A','A')
strategy = c('A','A','A','A')
decile = c(0,0,10,10)
asset = c('A','B','A','B')
lower = c(10,20,10, 15)
mean = c(30,50,60, 70)
upper = c(70,90,86,90)
data = data.frame(scenario, strategy, decile, asset, lower, mean, upper)
一旦我们有了data
df,我们就可以使用ggplot2来创建一个堆叠条形图,如下所示:
ggplot(wide, aes(x=decile, y=mean, fill=asset)) +
geom_bar(stat="identity") +
facet_grid(strategy~scenario) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.25)
但是,生成的误差条针对每个堆叠条的每个单独组件:
我很欣赏我为 df 的每一行提供 lower
、mean
和 upper
的结果,但即使我对这些求和每十分之一我没有在每个条形堆栈的顶部得到我想要的误差条。
正确的 ggplot2 代码是什么,或者启用此功能的正确数据结构是什么?
最佳答案
我认为您正确地认识到您需要操纵数据而不是绘图。您实际上无法在错误栏上设置 position_stack
,因此您需要重新计算错误栏的平均值、上限和下限值。本质上,这意味着获取平均值的累积和,并相应地移动上限和下限范围。您可以在 dplyr
管道内执行此操作。
注意,我认为您还需要在误差线上设置一个 position_dodge
,因为即使适当移动,它们的范围也会重叠,这将使它们更难以直观地解释:
library(ggplot2)
library(dplyr)
data %>%
mutate(lower = lower - mean, upper = upper - mean) %>%
group_by(decile) %>%
arrange(rev(asset), by.group = TRUE) %>%
mutate(mean2 = cumsum(mean), lower = lower + mean2, upper = upper + mean2) %>%
ggplot(aes(x = decile, y = mean, fill = asset)) +
geom_bar(stat = "identity") +
facet_grid(strategy ~ scenario) +
geom_errorbar(aes(y = mean2, ymin = lower, ymax = upper), width = 2,
position = position_dodge(width = 2)) +
geom_point(aes(y = mean2), position = position_dodge(width = 2))
关于r - 使用堆叠条形图时,ggplot2 条形图带有误差条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64209051/