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

基于ggplot2绘制分性别并排堆叠条形图的技术问询

搞定GBD数据的男女堆叠条形图并排问题

要实现同一个SDI地区下,男女的癌症归因DALY堆叠条形图并排展示,不用facet_wrap拆分图,直接在同一轴上实现并排的改法如下:

核心调整点

  • 把sex_name加入aes的group参数,让ggplot识别性别为分组维度
  • 用position_dodge()控制男女组的并排间距,同时保留癌症类别的堆叠
  • 可选:先计算每个SDI地区的总DALY,确保排序逻辑和原代码一致

修改后的完整代码

library(ggplot2)
library(dplyr)

# 预处理数据,计算每个地区总DALY用于排序(和原代码reorder逻辑对齐)
plot_data <- globaldata %>%
  filter(measure_id == 2,
         location_id != 1,
         sex_id != 3,
         age_id == 22,
         rei_id == 110,
         metric_id == 1,
         year == 2021) %>%
  group_by(location_name) %>%
  mutate(total_val = sum(val)) %>%
  ungroup()

ggplot(plot_data, 
       aes(x = reorder(location_name, total_val), 
           y = val, 
           fill = cause_name,
           group = sex_name)) +
  geom_bar(stat = 'identity', 
           position = position_dodge(width = 0.8)) + # 控制男女条的并排间距
  theme_classic() +
  labs(x = 'SDI地区', 
       y = '饮食风险归因总DALY', 
       title = '2021年', 
       fill = '消化道癌症') +
  coord_flip() +
  # 可选:给男女组加边框色区分
  aes(color = sex_name) +
  scale_color_manual(values = c(Male = "#2c3e50", Female = "#7f8c8d"))

代码说明

  • group = sex_name:让ggplot识别性别为分组,这样才能把同一地区的男女条并排
  • position_dodge(width = 0.8):调整数值可以改变男女条之间的间距,0.8是比较合适的默认值
  • 预处理时的total_val:确保SDI地区的排序是基于该地区所有性别和癌症的总DALY,和你原来用reorder(location_name, val)的逻辑一致
  • 加color = sex_name是为了让男女组的边框颜色不同,更容易区分,不需要的话可以删掉最后两行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:22:05