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

如何在ggplot2中将横向条形图按从大到小排序?

横向条形图按大小排序的解决方法

方法一:直接在绘图时用reorder()指定排序依据

你之前尝试reorder未成功,是因为没有明确指定排序的权重(即条形的长度,也就是计数)。修改geom_bar的y轴映射,用reorder()将ETNIA(IBGE)按计数的倒序排列即可:

library(ggplot2)

g1 = ggplot(data = DadosDVMO)

g1 + geom_bar(aes(y = reorder(`ETNIA(IBGE)`, -..count..), color = `ETNIA(IBGE)`,
                  fill = `ETNIA(IBGE)`)) + 
  xlab('Candidatos a DVMO') + 
  ylab('Grupo Étnico (IBGE)') + 
  scale_x_continuous(expand = expansion(add = c(0,200)))
  • reorder(var, weight)会根据weight的值对var重新排序,加负号-..count..是让计数最大的族群排在最上方(横向条形图的y轴从上到下对应条形从左到右的长度)。
  • ..count..是ggplot2内置的统计变量,代表每个分类的观测数量。

方法二:提前统计数据并设置有序因子

如果希望更直观地控制排序逻辑,可以先统计每个族群的候选人数,再将分类变量转为有序因子:

library(ggplot2)
library(dplyr)

# 统计每个族群的候选人数并排序
DadosDVMO_sum <- DadosDVMO %>%
  count(`ETNIA(IBGE)`, name = "Candidatos") %>%
  arrange(desc(Candidatos)) %>%
  mutate(`ETNIA(IBGE)` = factor(`ETNIA(IBGE)`, levels = `ETNIA(IBGE)`))

# 绘制条形图(用stat="identity"直接使用统计好的数值)
ggplot(data = DadosDVMO_sum) +
  geom_bar(aes(y = `ETNIA(IBGE)`, x = Candidatos, color = `ETNIA(IBGE)`, fill = `ETNIA(IBGE)`),
           stat = "identity") +
  xlab('Candidatos a DVMO') + 
  ylab('Grupo Étnico (IBGE)') + 
  scale_x_continuous(expand = expansion(add = c(0,200)))

这种方法的优势是可以清晰看到每个族群的具体数值,排序逻辑更透明,后续调整排序规则也更方便。

内容的提问来源于stack exchange,提问作者Luana JBC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:57:34