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

如何用ggplot2绘制含全年月份(含无数据月份)的堆叠柱状图

解决方案

步骤1:整理月份格式

先把数据读入R,然后将Month转换为有序因子,指定完整的12个月份顺序,确保3月(Mar)被纳入X轴的显示序列:

# 构造数据框(假设你的数据名为df)
df <- data.frame(
  Month = c("Oct", "Apr", "Nov", "Oct", "Sep", "Jul", "Aug", "Oct", "May", "Feb", 
            "Dec", "Feb", "Nov", "Nov", "Nov", "May", "Jan", "Apr", "Sep", "Sep", 
            "Dec", "Aug", "Jul", "Sep", "Jun", "Apr", "Jun", "Jan", "Nov", "Aug", "Oct"),
  Cause = c("Unknown", "Unknown", "Roadkill", "Disease", "Predation", "Disease", 
            "Predation", "Disease", "Roadkill", "Predation", "Predation", "Predation", 
            "Unknown", "Hunting", "Unknown", "Unknown", "Unknown", "Unknown", "Disease", 
            "Disease", "Unknown", "Disease", "Predation", "Disease", "Predation", 
            "Predation", "Unknown", "Unknown", "Disease", "Disease", "Hunting")
)

# 定义12个月份的正确顺序
month_order <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
df$Month <- factor(df$Month, levels = month_order, ordered = TRUE)

步骤2:补全全量计数(含0值)

用dplyr统计每个月份、每个死亡原因的数量, .drop = FALSE参数会自动保留所有月份-原因组合,无数据的组合计数为0:

library(dplyr)
count_df <- df %>%
  count(Month, Cause, .drop = FALSE)

如果不想用dplyr,也可以用基础R的table函数实现:

count_table <- table(df$Month, df$Cause)
count_df <- as.data.frame(count_table, responseName = "n")
colnames(count_df)[1] <- "Month"

步骤3:绘制堆叠柱状图

用ggplot2绘制堆叠柱状图,X轴按有序月份排列,Y轴为计数,按Cause分组堆叠:

library(ggplot2)
ggplot(count_df, aes(x = Month, y = n, fill = Cause)) +
  geom_col() +
  labs(x = "月份", y = "计数", title = "各月份死亡原因堆叠统计") +
  theme_minimal()

关键说明

  • 有序因子确保X轴严格按1-12月顺序显示,不会缺失无数据的3月
  • 补全0值计数后,3月会显示为高度为0的柱子,保证X轴完整性
  • geom_col用于呈现预统计好的数值,比自动计数的geom_bar更适配补全后的数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:12:36