如何在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
相关产品推荐
相关产品推荐

