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

如何在R(ggplot2)中绘制多变量收入构成堆叠柱状图

解决方法

1. 问题原因

你当前使用的是宽格式数据,每个收入类别是独立列,而ggplot的fill参数需要长格式的分类变量才能分组堆叠,直接拼接多个列作为fill参数会因为长度不匹配触发报错。

2. 完整实现代码

library(tidyverse)
library(lubridate)

# 第一步:宽表转长表,同时计算每个收入类别的占比
plot_data <- August_Data %>%
  # 先把月份转成日期格式,保证x轴顺序正确
  mutate(Month_End = mdy(Month_End)) %>%
  # 选择需要堆叠的三个收入列转长格式
  pivot_longer(cols = c(Dues, `Total Retail`, `Other Revenue`),
               names_to = "收入类别",
               values_to = "收入金额") %>%
  # 按月份分组计算每个类别的营收占比
  group_by(Month_End) %>%
  mutate(占比 = paste0(round(收入金额/`Total Revenue`*100, 1), "%")) %>%
  ungroup()

# 第二步:绘制堆叠柱状图
ggplot(plot_data, aes(x = Month_End, y = 收入金额, fill = 收入类别)) +
  # 堆叠柱形,geom_col默认position="stack"可省略
  geom_col() +
  # 添加百分比标签,vjust=0.5让标签在每个堆叠块居中
  geom_text(aes(label = 占比), position = position_stack(vjust = 0.5), size = 3.5) +
  # 优化x轴日期显示格式
  scale_x_date(date_labels = "%Y-%m", date_breaks = "1 month") +
  # 可自定义配色、标题等美化参数
  labs(x = "月份", y = "营收金额", fill = "收入类型", title = "月度营收构成")

3. 代码说明

  • pivot_longer将三个收入类别列从宽格式转为长格式,生成分类变量收入类别作为fill参数的映射值
  • 分组计算占比时直接用原数据的Total Revenue做分母,避免重复求和
  • position_stack(vjust = 0.5)保证每个百分比标签对应在所属收入类别的堆叠块中间位置

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:24:02