基于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
相关产品推荐
相关产品推荐

