ggplot柱状图y值顺序异常问题求助
你当前的代码有两个核心问题:数据框构造错误导致分组对应关系混乱,以及分组类别未指定自定义顺序,最终使得柱状图不符合预期。
问题拆解
数据框构造错误:
你初始化stadium列时只写了3个值,但food和sales有6个值,R会自动循环补齐stadium列,导致stadium的顺序变成BI gain, BI efficiency, BI effectiveness, BI gain, BI efficiency, BI effectiveness,这和你想要的「每个stadium对应两组food数据」的结构不符,分组逻辑彻底混乱。分组类别未指定顺序:
food列默认是字符型,ggplot会按字母顺序排序类别,加上数据构造错误的影响,最终出现柱状图顺序颠倒的情况;同时填充颜色没有和类别明确绑定,容易出现颜色对应错位。
修正步骤
正确构造数据框:
使用rep(..., each=2)让每个stadium值重复两次,确保每组stadium对应historical和tele-rehab数据:df <- data.frame( stadium = rep(c('BI gain', 'BI efficiency', 'BI effectiveness'), each = 2), food = rep(c('historical','tele-rehab'), 3), sales = c(30.0, 20.0, 49.0, 47.0, 58.0, 60.0) )指定分组的自定义顺序:
将food转为因子,并明确指定你想要的顺序(historical在前,tele-rehab在后),同时确认stadium的横轴显示顺序:# 指定横轴stadium的显示顺序 df$stadium <- factor(df$stadium, levels = c("BI gain", "BI efficiency", "BI effectiveness")) # 指定每组内柱状图的排列顺序,这是核心 df$food <- factor(df$food, levels = c("historical", "tele-rehab"))绑定填充颜色与类别:
在scale_fill_manual里明确将颜色绑定到对应的food类别,避免因顺序变动导致颜色错位:scale_fill_manual('Where', values = c("historical" = "black", "tele-rehab" = "white"))
完整修正代码
library(ggplot2) # 正确构造数据框 df <- data.frame( stadium = rep(c('BI gain', 'BI efficiency', 'BI effectiveness'), each = 2), food = rep(c('historical','tele-rehab'), 3), sales = c(30.0, 20.0, 49.0, 47.0, 58.0, 60.0) ) # 设置横轴和分组的自定义顺序 df$stadium <- factor(df$stadium, levels = c("BI gain", "BI efficiency", "BI effectiveness")) df$food <- factor(df$food, levels = c("historical", "tele-rehab")) # 绘制柱状图 ggplot(df, aes(fill = food, y = sales, x = stadium)) + geom_bar(position = 'dodge', stat = 'identity', colour = "black") + scale_fill_manual('Where', values = c("historical" = "black", "tele-rehab" = "white"))
效果说明
修正后,每组stadium会先显示黑色的historical柱状图,再显示白色的tele-rehab柱状图,完全符合你要求的顺序,同时数据对应关系和颜色绑定都准确无误。
内容的提问来源于stack exchange,提问作者Ana

