如何在R的ggplot中以两个数值变量为fill绘制堆叠柱状图
R ggplot2绘制双变量堆叠柱状图解决方案
问题核心原因
你之前的代码存在两个关键错误:
- 数据长表转换时未指定标识列,
melt默认会将所有列转为值变量,导致数据结构错乱 - 美学映射中x轴变量配置错误,你需要的x轴维度是流行病学周
SEM_NOT,而非代码里的EVTY
完整可运行代码
方法1:基于reshape2包实现
# 加载依赖包 library(reshape2) library(ggplot2) # 数据长表转换:指定SEM_NOT为固定标识列,仅转换两个死亡数值列 mm <- melt( ddf, id.vars = "SEM_NOT", measure.vars = c("n.x", "n.y"), variable.name = "分类", value.name = "死亡人数" ) # 绘制堆叠柱状图 ggplot(mm, aes(x = SEM_NOT, y = 死亡人数, fill = 分类)) + geom_bar(stat = "identity", position = "stack") + # 自定义样式匹配Excel效果,可按需调整 labs(x = "流行病学周", y = "死亡人数") + scale_fill_manual( values = c("n.x" = "#4472C4", "n.y" = "#ED7D31"), # 匹配Excel默认配色 labels = c("疾病导致死亡数", "接种人群死亡数") ) + theme_minimal()
方法2:基于tidyr包实现(更推荐的现代语法)
library(tidyr) library(ggplot2) library(dplyr) mm <- ddf %>% pivot_longer( cols = c(n.x, n.y), names_to = "分类", values_to = "死亡人数" ) # 绘图代码和上述一致 ggplot(mm, aes(x = SEM_NOT, y = 死亡人数, fill = 分类)) + geom_bar(stat = "identity", position = "stack") + labs(x = "流行病学周", y = "死亡人数") + scale_fill_manual( values = c("n.x" = "#4472C4", "n.y" = "#ED7D31"), labels = c("疾病导致死亡数", "接种人群死亡数") ) + theme_minimal()
补充说明
如果需要绘制百分比堆叠柱状图,仅需将geom_bar的position参数改为position = "fill"即可,y轴会自动显示占比。
内容的提问来源于stack exchange,提问作者user15159175
相关产品推荐
相关产品推荐

