You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:27:42