ggplot2中geom_bar组件颜色顺序不生效问题求助
解决ggplot柱状图堆叠颜色顺序问题
问题中的代码生成的柱状图堆叠顺序不符合预期,需要调整为:第一个柱子从下到上红(m)-绿(n),第二、第三个柱子从下到上红(m)-蓝(p)-绿(n)。
解决方案
ggplot的条形堆叠顺序由离散变量的因子水平顺序决定,默认按字母排序,因此需要手动指定value列的因子水平,强制堆叠顺序符合需求:
x <- 1:10 z1 <- c("m", "m", "m", "m", "m", "m", "m", "n", "n", "n") z2 <- c("m", "m", "m", "m", "p", "p", "p", "n", "n", "n") z3 <- c("m", "m", "m", "m", "p", "n", "n", "n", "n", "n") df <- data.frame(x, z1, z2, z3) colors <- c("m" = "#f8766d", "n" = "#00BA38", "p" = "#619CFF") df_long <- pivot_longer(df, cols = c("z1", "z2", "z3"), names_to = "variable", values_to = "value") # 指定因子水平顺序,控制堆叠的上下顺序(从下到上对应levels的顺序) df_long$value <- factor(df_long$value, levels = c("m", "p", "n")) ggplot(df_long, aes(x = variable, fill = value)) + geom_bar() + scale_fill_manual(values = colors) + xlab("") + ylab("Count")
原理说明
- 默认情况下,ggplot会按离散变量的字母顺序设置因子水平(
m,n,p),堆叠时会从下到上按这个顺序排列,导致n在p上方,不符合需求。 - 通过手动指定
levels = c("m", "p", "n"),强制堆叠顺序从下到上为m→p→n,完美匹配你想要的颜色层次。
内容的提问来源于stack exchange,提问作者user21189481
相关产品推荐
相关产品推荐

