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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:18:02