ggplot堆叠条形图:如何让分组内堆叠按n值排序?
分组堆叠条形图的组内排序问题
问题背景
现有如下DataFrame:
Race n ID White 7000 A Black 1200 A Asian 300 A Unknown 100 A Native American 50 A Alaska Native 20 A Other 5 A White 300 B Black 50 B Unknown 20 B Asian 10 B Other 5 B
需要创建以A、B为分组的堆叠条形图,要求每个分组内的堆叠按n值排序。使用了以下代码:
ggplot(race_df) + aes(x = ID, y = n, fill = reorder(Race,n)) + geom_bar(position = "fill", stat = "identity")
结果A组堆叠排序正确,但B组未按n值排序。疑问:是否因两组Race值不全相同导致?如何解决?
原因分析
确实是因为两组Race值不完整——A组包含Native American和Alaska Native,但B组没有这两个类别。reorder(Race, n)是基于整个数据集的n值对Race做全局排序,而非按每个ID分组单独排序,所以B组的堆叠会沿用全局排序规则,而非自身的n值顺序。
解决方法
要实现每个分组内单独按n值排序,需先对数据做预处理,给每个ID分组内的Race赋予基于组内n值的排序权重,再用这个权重指定填充色的顺序:
- 用
dplyr和forcats对数据按ID分组,生成组内排序后的Race变量:
library(dplyr) library(forcats) race_df_sorted <- race_df %>% group_by(ID) %>% mutate(Race_sorted = fct_reorder(Race, n)) # 组内按n值从大到小排序Race ungroup()
- 绘图时使用处理后的
Race_sorted作为填充变量,同时可以把图例名称改回原名称:
ggplot(race_df_sorted) + aes(x = ID, y = n, fill = Race_sorted) + geom_bar(position = "fill", stat = "identity") + labs(fill = "Race")
这样处理后,A和B组的堆叠都会各自按照组内的n值大小排序。
内容的提问来源于stack exchange,提问作者user3249770
相关产品推荐
相关产品推荐

