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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:05:18