如何用ggplot2绘制按Age降序排列的条形图?
问题:ggplot2翻转条形图未按预期降序排列
我有一个包含Name和Age列的数据框,已按Age列降序排序得到df2,但使用ggplot2绘制经coord_flip()翻转的条形图时,并未呈现预期的降序排列效果。
我的代码及输出
Name <- c("Jon", "Bill", "Maria", "Ben", "Tina") Age <- c(23, 41, 32, 58, 26) df <- data.frame(Name, Age) print(df) # Name Age # 1 Jon 23 # 2 Bill 41 # 3 Maria 32 # 4 Ben 58 # 5 Tina 26 # 按Age降序排序 df2<-df%>% arrange(desc(Age)) print(df2) # 输出结果: # Name Age # 1 Ben 58 # 2 Bill 41 # 3 Maria 32 # 4 Tina 26 # 5 Jon 23
绘图代码:
# 使用ggplot绘图 df2%>%ggplot(aes(x=Name, y=Age)) + geom_bar(stat="identity", fill="#f68060", alpha=.6, width=.4) + coord_flip() + xlab("") + theme_bw()
当前输出图:
原因及解决方法
问题出在Name列是字符型,ggplot2默认会对字符型的x轴按字母顺序排列,和数据框的行顺序无关。要实现预期的排序,需要把Name转换为因子类型,并指定因子水平为df2中Name的顺序。
修改后的代码(二选一即可):
方法一:提前转换因子
# 转换Name为因子,指定水平为df2的Name顺序 df2$Name <- factor(df2$Name, levels = df2$Name) # 重新绘图 df2%>%ggplot(aes(x=Name, y=Age)) + geom_bar(stat="identity", fill="#f68060", alpha=.6, width=.4) + coord_flip() + xlab("") + theme_bw()
方法二:在绘图时直接指定因子
df2%>%ggplot(aes(x=factor(Name, levels=df2$Name), y=Age)) + geom_bar(stat="identity", fill="#f68060", alpha=.6, width=.4) + coord_flip() + xlab("") + theme_bw()
这样绘制出的条形图就会按照Age降序的顺序排列了。
内容的提问来源于stack exchange,提问作者thole
相关产品推荐
相关产品推荐

