如何在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
相关产品推荐
相关产品推荐

