如何在ggplot中生成按月份计算收入占比的分组柱状图?
修改方案
问题核心是你当前代码里的sum(income)是对整个数据集求和,要改成按月份分组计算当月总收入,再计算品类收入占当月的比例。以下是修改后的完整代码:
library(tidyverse) library(scales) df |> group_by(month, category) |> summarize(income = sum(income, na.rm=TRUE), .groups = "drop_last") |> # 保留month分组 mutate(month_total = sum(income), # 计算当月所有品类的总收入 monthly_pct = income / month_total) |> # 计算当月内的占比 ggplot(aes(x=month,y=income, fill=category)) + geom_bar(position="dodge", stat="identity") + geom_text(aes(label=percent(monthly_pct)), position = position_dodge(width=0.9), angle = 90, hjust=-0.1) + labs(x="Month",y="Income") + ylim(0, 4000)
关键修改点:
- 在
summarize中添加.groups = "drop_last":默认summarize会取消所有分组,这个参数让我们只去掉最内层的category分组,保留month分组,方便后续计算当月总收入。 - 新增
mutate步骤:计算每个月的总收入month_total,再用品类收入除以该值得到当月占比monthly_pct。 - 把
geom_text中的占比计算替换为提前算好的monthly_pct,确保是基于当月的比例。
内容的提问来源于stack exchange,提问作者guy_merchie
相关产品推荐
相关产品推荐

