ggplot2分组柱状图手动排序异常:指定顺序后元素消失且排序错误
ggplot2分组柱状图手动排序问题解决方法
问题描述
尝试在ggplot2中按S. Giorgio, S. Agostino, S.Marinella, Grottini的顺序手动排列分组柱状图的柱子,但设置location为因子指定水平后,S. Agostino消失且排序仍不符合预期,使用的代码如下:
ggplot(mydata_2, aes(x = location, y = values, fill = type)) + geom_bar(stat = "identity", position = "dodge") mydata_2$location <- factor(mydata_2$location, levels = c('S. Giorgio', 'S. Agostino', 'S. Marinella', 'Grottini')) ggplot(mydata_2, aes(x = location, y = values, fill = type)) + geom_bar(stat = "identity", position = "dodge")
解决步骤
1. 排查拼写一致性问题
出现分组消失、排序异常的核心原因是指定的因子水平与原数据中location的实际取值不匹配:
- 运行
unique(mydata_2$location)查看原数据中location的真实取值,比如你代码里因子水平写的是S. Marinella(带空格),但原数据里可能是S.Marinella(无空格);同理S. Agostino可能存在拼写差异(比如原数据是S.Agostino)。
2. 修正因子水平的拼写
根据原数据的真实取值调整因子水平的字符串,确保完全匹配,示例代码:
# 先确认原数据的location唯一值 unique(mydata_2$location) # 修正因子水平,与原数据取值完全一致 mydata_2$location <- factor(mydata_2$location, levels = c('S. Giorgio', 'S. Agostino', 'S.Marinella', 'Grottini')) # 重新绘制图表 ggplot(mydata_2, aes(x = location, y = values, fill = type)) + geom_bar(stat = "identity", position = "dodge")
3. 灵活保留所有分组(可选)
如果原数据中还有其他location取值,不想被过滤,可以用forcats包的fct_relevel函数指定排序顺序,同时保留所有分组:
library(forcats) # 指定优先排序的分组,其余分组按原顺序保留 mydata_2$location <- fct_relevel(mydata_2$location, 'S. Giorgio', 'S. Agostino', 'S.Marinella', 'Grottini') ggplot(mydata_2, aes(x = location, y = values, fill = type)) + geom_bar(stat = "identity", position = "dodge")
内容的提问来源于stack exchange,提问作者Miriam
相关产品推荐
相关产品推荐

