如何在R中按堆叠段高度降序排列百分比堆叠条形图?
按总场地面积降序排列百分比堆叠条形图的解决方案
核心思路
利用forcats包的fct_reorder()函数自动根据「总场地面积」对城市分类变量重新排序,无需手动指定顺序,完美适配大数据集。结合ggplot2的百分比堆叠参数实现需求。
具体步骤与代码示例
假设你的数据集名为df,包含字段:city(城市,分类变量)、category(堆叠类别,分类变量)、area(单类场地面积,定量变量)。
- 加载依赖包
library(tidyverse) # 包含dplyr、ggplot2、forcats,一站式处理数据和绘图
- 数据预处理:按总场地面积排序城市
先计算每个城市的总场地面积,再用fct_reorder()将city因子按总面积降序排列:
df <- df %>% group_by(city) %>% mutate(total_area = sum(area)) %>% # 计算每个城市的总场地面积 ungroup() %>% mutate(city = fct_reorder(city, total_area, .desc = TRUE)) # 按总面积降序重排城市顺序
如果你的数据集已经有total_area字段(无需计算),直接执行最后一行即可:
df <- df %>% mutate(city = fct_reorder(city, total_area, .desc = TRUE))
- 绘制百分比堆叠条形图
使用position = "fill"实现百分比堆叠,配合coord_flip()让总场地最大的城市位于顶部:
ggplot(df, aes(x = city, y = area, fill = category)) + geom_col(position = "fill") + # 生成百分比堆叠条形 coord_flip() + # 翻转坐标轴,使城市纵向排列,顶部为总面积最大的城市 scale_y_continuous(labels = scales::percent) + # 将y轴转换为百分比标签 labs(x = "城市", y = "场地面积占比", fill = "场地类别") # 设置坐标轴和图例标题
关键说明
fct_reorder()会自动根据指定的定量变量(这里是total_area)调整分类变量的因子顺序,.desc = TRUE确保降序排列,完全避免手动编写排序向量的繁琐。position = "fill"会将每个条形的高度标准化为1(即100%),实现百分比堆叠效果。coord_flip()翻转坐标轴后,y轴的城市顺序从上到下是降序,对应视觉上顶部的条形为总场地面积最大的城市。
内容的提问来源于stack exchange,提问作者Devon
相关产品推荐
相关产品推荐

