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

