如何在堆叠条形图中反转 geom_errorbar 的位置?

Posted

技术标签:

【中文标题】如何在堆叠条形图中反转 geom_errorbar 的位置?【英文标题】:How to reverse position of geom_errorbar in stacked barchart? 【发布时间】:2020-01-26 17:39:44 【问题描述】:

我正在创建一个包含两个组和 geom_errorbar 的简单堆叠 geom_bar。我把两组的顺序颠倒了,但是误差线的顺序不会跟着。

我已经尝试通过更改组的顺序作为因素: - 填充 = forcats::fct_rev(levels) 并更改数据框中组的顺序: - 排列(df, desc(levels))

ggplot(subset(c, frac %in% c("DOC", "POC")), aes(x=Station.name, y=Ave,
                                                     fill=frac))+
      geom_bar(stat="identity", width=0.6)+
      scale_fill_manual(values = c("lightskyblue", "dodgerblue2"))+
      geom_errorbar(aes(x=Station.name, ymin=Ave-sd, ymax=Ave+sd),
                  width=.2,size=0.2)

对于每次尝试,图中的条形都成功地改变了它们的顺序,但误差线从不跟随....我想改变顺序,使具有最高值(深蓝色)的组位于底部值最低的组(浅蓝色)位于顶部。这两个数字说明了我的结果类型。 (问题与误差线的位置有关,与值无关)。

我想反其道而行之:

为什么误差条的顺序不按照条的顺序?

这是数据框的一个子集:

结构(列表(站名=结构(c(1L,2L,3L,4L,5L,6L,7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L、18L、19L、20L、1L、2L、3L、4L、5L、6L、7L、8L、9L、10L、11L、 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), .Label = c("a", "b", “c”、“d”、“e”、“f”、“g”、“h”、“i”、“j”、“k”、“l”、“m”、“n”、“o” ", "p", “q”、“r”、“s”、“t”)、class= “因子”)、 Ave = c(3.525, 3.025, 1.45, 2.975, 1.9425, 3.066666667, 1.68, 1.9、2.575、4、4.7、5.566666667、2.4、3.05、2.4、5.325、2.825、 1.825、1.2075、1.165、0.1、0.025、0.05、1.11e-16、0.055、 0, 0.0525, 0, 0.05, 0.05, 0.125, 0.266666667, 0.075, -0.125, 0.125、0.075、0.15、0.025、0.0725、-0.0075、3.425、3、1.4、 2.975、1.8875、3.066666667、1.6275、1.9、2.525、3.95、4.575、 5.3、2.325、3.175、2.275、5.25、2.675、1.8、1.135、1.1725 ), sd = c(0.763216876, 0.170782513, 0.2081666, 0.457347424, 0.789023658, 0.776745347, 1.239462249, 0.816496581, 0.287228132, 1.699019325、2.24053565、1.77857621、0.496655481、0.873689495、 0.081649658, 0.994568583, 1.129527925, 0.713559154, 0.344806709, 0.246779254, 0.163299316, 0.05, 0.1, 0.141421356, 0.052599113, 0.1, 0.098446263, 0, 0.057735027, 0.057735027, 0.125830574, 0.152752523, 0.05, 0.206155281, 0.189296945, 0.05, 0.191485422, 0.125830574、0.037749172、0.069940451、0.62915287、0.141421356、 0.21602469、0.49244289、0.755397246、0.757187779、1.14441761、 0.816496581、0.320156212、1.755942292、2.136000936、1.637070554、 0.518812747、0.81394103、0.206155281、1.034408043、1.209338662、 0.594418483, 0.318904374, 0.278732249), frac = 结构(c(3L, 3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L,3L, 3L,3L,3L,3L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("DOC", "POC", "TOC"), class= "因子")), class= "data.frame", row.names = c(NA, -60L))

【问题讨论】:

对于您正在绘制的误差线 (Ave-sd) & (Ave+sd) 只是因为小条在顶部,并不意味着它们的值发生了变化,因此误差条的位置是不会随着情节顺序的变化而变化。为了获得解决方案,请编辑问题并提供样本数据供人们测试。 感谢您的评论@DaveT 我试图包含我的数据框的一个子集,这是正确的做法吗?我不确定我是否理解您关于编辑我的问题的评论 (?)。 【参考方案1】:

这是解决方案,但堆叠解决方案确实提供了非常有意义的演示,因为误差条彼此重叠。我建议使用闪避图表更清晰地显示数据。

要正确创建堆栈图,需要将“frac”列和因子水平排序为所需的绘图顺序。 详见代码中的 cmets。

df<-structure(list(Station.name = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), .Label = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t"), class = "factor"), Ave = c(3.525, 3.025, 1.45, 2.975, 1.9425, 3.066666667, 1.68, 1.9, 2.575, 4, 4.7, 5.566666667, 2.4, 3.05, 2.4, 5.325, 2.825, 1.825, 1.2075, 1.165, 0.1, 0.025, 0.05, 1.11e-16, 0.055, 0, 0.0525, 0, 0.05, 0.05, 0.125, 0.266666667, 0.075, -0.125, 0.125, 0.075, 0.15, 0.025, 0.0725, -0.0075, 3.425, 3, 1.4, 2.975, 1.8875, 3.066666667, 1.6275, 1.9, 2.525, 3.95, 4.575, 5.3, 2.325, 3.175, 2.275, 5.25, 2.675, 1.8, 1.135, 1.1725 ), sd = c(0.763216876, 0.170782513, 0.2081666, 0.457347424, 0.789023658, 0.776745347, 1.239462249, 0.816496581, 0.287228132, 1.699019325, 2.24053565, 1.77857621, 0.496655481, 0.873689495, 0.081649658, 0.994568583, 1.129527925, 0.713559154, 0.344806709, 0.246779254, 0.163299316, 0.05, 0.1, 0.141421356, 0.052599113, 0.1, 0.098446263, 0, 0.057735027, 0.057735027, 0.125830574, 0.152752523, 0.05, 0.206155281, 0.189296945, 0.05, 0.191485422, 0.125830574, 0.037749172, 0.069940451, 0.62915287, 0.141421356, 0.21602469, 0.49244289, 0.755397246, 0.757187779, 1.14441761, 0.816496581, 0.320156212, 1.755942292, 2.136000936, 1.637070554, 0.518812747, 0.81394103, 0.206155281, 1.034408043, 1.209338662, 0.594418483, 0.318904374, 0.278732249), frac = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("DOC", "POC", "TOC"), class = "factor")), class = "data.frame", row.names = c(NA, -60L))

library(ggplot2)
library(dplyr)
library(forcats)

#dodge plot
ggplot(subset(df, frac %in% c("DOC", "POC")), 
       aes(x=Station.name, y=Ave, fill=frac))+
  geom_col(width=0.6, position = "dodge")+
  scale_fill_manual(values = c("lightskyblue", "dodgerblue2"))+
  geom_errorbar(aes(x=Station.name, ymin=Ave-sd, ymax=Ave+sd),
                width=.2,size=0.2, position = position_dodge(0.5))

#to create the stacked chart with the error bars in the proper location
#reverse the order of the factor and resort the data frame to match the new factor order
df$frac<-fct_rev(df$frac)
df<-df[rev(order(df$frac)),]

#calculate the limits based on the subset
df2<-df %>% filter(frac=="DOC" | frac=="POC") %>% 
  group_by(Station.name) %>% 
  mutate(ymin=cumsum(Ave)-sd, ymax=cumsum(Ave)+sd)

#plot
ggplot(df2, aes(x=Station.name, y=Ave, fill=frac))+
  geom_col(width=0.6)+
  scale_fill_manual(values = c("lightskyblue", "dodgerblue2"))+
  geom_errorbar(aes(x=Station.name, ymin=ymin, ymax=ymax),
                width=.2,size=0.2)

【讨论】:

以上是关于如何在堆叠条形图中反转 geom_errorbar 的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Plotly 删除堆叠和分组条形图中的 x 轴刻度标签

如何关闭 ggplot 堆叠条形图中的颜色图例?所有解决方案都失败了

在 100% 堆叠的条形图中更改颜色 python

R语言ggplot2可视化堆叠的条形图(stacked bar plot)并在每一个条形图的的中间添加对应的数值值标签定位在geom_col堆叠的条形图中的每个条形段的中间

如何将标签添加到堆叠条形图

反转图例顺序而不更改绘图快速条形图中的条形顺序