在ggplot中基于双条件排序条形图:分组且组内数值升序排列
问题原因说明
你的代码存在3个核心错误导致无法得到预期效果:
- 管道排序后的数据未被ggplot正确调用,你在
aes中使用df$xxx的写法直接读取了未排序的原始数据,前面的arrange操作完全未生效 - 因子排序逻辑错误,你需要控制顺序的是X轴的站点,而非分组,应该将站点列按排序后的结果设置为因子水平
- 颜色映射配置错误,填充属性对应
fill参数,你用了控制描边的scale_color_manual,且没有将分组颜色映射放入aes中
修正后可直接运行的代码
# 加载依赖包 library(dplyr) library(ggplot2) # 原始数据 df <- data.frame( stringsAsFactors = FALSE, Sites = c("Site 1","Site 2","Site 3", "Site 4","Site 5","Site 6","Site 7","Site 8","Site 9", "Site 10","Site 11"), Values = c(184.7955548,171.1466314, 245.5952181,188.3072784,259.9438698,210.3448318, 173.7977541,182.5497301,198.7985429,188.0458496,215.5709303), Groups = c(1, 1, 3, 3, 2, 3, 1, 3, 3, 2, 2)) # 绘图代码 df %>% arrange(Groups, Values) %>% # 先按分组排序,组内按数值从小到大排序 mutate(Sites = factor(Sites, levels = Sites)) %>% # 固定X轴顺序为当前排序结果 ggplot(aes(x = Sites, y = Values, fill = as.factor(Groups)))+ # 映射填充色为分组 geom_col()+ # 等价于geom_bar(stat = "identity"),语法更简洁 scale_fill_manual(values = c('royalblue1', 'slategray2', 'yellow1'))+ # 对应fill属性设置颜色 ylab("Values")+ xlab("")+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
核心修改点说明
- 移除了所有
df$写法,管道处理后的排序数据会直接传递给ggplot,保证排序生效 - 将
Sites转为因子,水平设置为arrange后的顺序,X轴就会按照「分组聚集+组内升序」的逻辑排列 - 把填充色映射放入
aes内,将Groups转为因子对应离散色值 - 将
scale_color_manual替换为scale_fill_manual,和填充属性对应,颜色才能正常渲染
内容的提问来源于stack exchange,提问作者Drop
相关产品推荐
相关产品推荐

