如何用ggplot基于分年度分位数数据绘制100%堆叠面积图?
100%堆叠面积图实现方案(针对fyear/decile/aqc分组数据)
核心逻辑
要实现每年各分位数占比总和为100%的堆叠面积图,关键是按年份单独计算每个分位数的AQC占比,而非全局统一计算。下面是具体的分步解决方法:
第一步:数据预处理(可选,但更直观)
用dplyr按年份分组,计算每个分位数的AQC占当年总AQC的百分比:
library(dplyr) library(ggplot2) # 假设原始数据框名为df df_processed <- df %>% group_by(fyear) %>% # 计算当年所有分位数的AQC总和(忽略缺失值) mutate(total_aqc = sum(aqc, na.rm = TRUE), # 计算当前分位数的占比(转成百分比) pct_aqc = aqc / total_aqc * 100) %>% ungroup()
第二步:绘制100%堆叠面积图
有两种可行的绘图方式:
方式一:用预处理好的百分比字段绘图
直接使用计算好的pct_aqc作为y轴,确保每个年份的占比总和为100%:
ggplot(df_processed, aes(x = fyear, y = pct_aqc, fill = factor(decile))) + # geom_area设置白色分隔线,增强分组可读性 geom_area(alpha = 0.8, color = "white", size = 0.5) + # 用离散色板区分不同分位数 scale_fill_viridis_d(name = "分位数") + # 自定义图表标签 labs(x = "年份", y = "占比 (%)", title = "各年份分位数AQC占比100%堆叠面积图") + theme_minimal()
方式二:让ggplot自动计算占比(无需预处理)
通过position = "fill"参数,让ggplot自动将每个年份的AQC数值转换为占比:
ggplot(df, aes(x = fyear, y = aqc, fill = factor(decile))) + # position="fill"会自动将每组(年份)的y值归一化为总和1 geom_area(position = "fill", alpha = 0.8, color = "white", size = 0.5) + # 将y轴刻度转换为百分比格式 scale_y_continuous(labels = scales::percent_format()) + scale_fill_viridis_d(name = "分位数") + labs(x = "年份", y = "占比", title = "各年份分位数AQC占比100%堆叠面积图") + theme_minimal()
常见错误排查
- 占比总和不为100%:大概率是没按年份分组计算占比,而是全局计算了总AQC,导致跨年份的占比混乱。
- 堆叠显示的是绝对数值:忘记设置
position = "fill",默认的position = "stack"只会堆叠绝对数值,不会归一化。 - 分位数颜色连续显示:
decile是数值型变量,需要用factor(decile)转成离散因子,否则ggplot会用连续色阶区分。 - 缺失值导致计算错误:计算总AQC时要加
na.rm = TRUE,避免缺失值导致总和为NA。
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

