如何让ggplot按data.frame原有顺序绘制geom_bar柱状图?
解决ggplot柱状图x轴自动排序的问题
这个问题很常见——ggplot对字符类型的x轴变量默认会按字母顺序排序,所以才会把你的a,d,b,c,e,f改成a,b,c,d,e,f。要保持原数据框的顺序,核心是把values列转换成因子(factor),并指定它的levels为原数据里的顺序。
给你两种简单的解决方式:
方式1:在绘图时直接指定x轴的因子顺序
不用修改原数据框,直接在aes()里把values转成带指定levels的因子就行:
ggplot(data=tmp, aes(x=factor(values, levels = tmp$values), y=frequency)) + geom_bar(fill="#003366", stat="identity") + labs(title = "...", x = "values", y = "Frequency")
这里levels = tmp$values就是告诉ggplot:按照原数据框里values列的现有顺序来排列x轴。
方式2:提前把数据框里的values转成因子
如果你后续还要多次用到这个顺序,提前处理数据更方便:
# 修改原数据框的values列 tmp$values <- factor(tmp$values, levels = tmp$values) # 然后用原来的绘图代码就行 ggplot(data=tmp, aes(x=values, y=frequency)) + geom_bar(fill="#003366", stat="identity") + labs(title = "...", x = "values", y = "Frequency")
另外提个小细节:你用cbind()创建数据框的时候,会把因子自动转成字符类型,所以如果一开始就想让values保持因子顺序,最好直接用data.frame()创建,避免这个问题:
tmp <- data.frame( values = factor(c("a", "d", "b", "c", "e", "f"), levels = c("a", "d", "b", "c", "e", "f")), n = c(1463, 159, 54, 52, 52, 220), frequency = c(0.7315, 0.0795, 0.027, 0.026, 0.026, 0.11) )
这样处理后,绘图时x轴就会严格按照你想要的a,d,b,c,e,f顺序排列啦~
内容的提问来源于stack exchange,提问作者tomsu
相关产品推荐
相关产品推荐

