如何使用ggplot将跨两数据集的三组密度图合并绘图并配置图例
跨数据集多组密度曲线合并绘制与统一图例配置
核心逻辑是:先将分属两个数据源的样本整理为结构完全一致的长格式数据框,通过统一的分组字段映射美学属性,避免叠加图层时出现图例割裂、标签错配的问题。
第一步:统一数据结构并预处理
两个数据集的核心测量值(压力得分)量纲完全一致,只需将分组信息统一整理为同一个字段,按行拼接即可:
- 处理df1(对照组数据):剔除缺失的压力值,将原变量
CGstress重命名为与df2一致的stress,新增分组标识标记为「对照组整体」 - 处理df2(研究组分性别数据):注意原
JP_Gender是Stata导入的带标签类型,不能直接转为因子使用,需按照预设的编码值转成可识别的中文分组标签 - 剔除所有样本的缺失值后,按行合并为单个分析用数据集
预处理参考代码:
# 加载依赖包 library(dplyr) library(ggplot2) # 清洗df1 df1_clean <- df1 %>% filter(!is.na(CGstress)) %>% transmute( stress = CGstress, group = "对照组整体" ) # 清洗df2,适配带标签的Stata变量 df2_clean <- df2 %>% filter(!is.na(stress)) %>% transmute( stress = stress, group = case_when( JP_Gender == 1 ~ "研究组男性", JP_Gender == 2 ~ "研究组女性", JP_Gender == 3 ~ "研究组跨性别", JP_Gender == 4 ~ "研究组其他" ) ) # 合并为统一数据集 combined_df <- bind_rows(df1_clean, df2_clean)
第二步:统一绘图与图例配置
基于合并后的数据集绘图,无需单独给每个密度图层传不同数据源,ggplot会自动基于group字段生成连续的统一图例,避免出现两套独立图例的问题:
ggplot(combined_df, aes(x = stress, fill = group)) + # 密度曲线配置:半透明填充、细白轮廓线区分边界 geom_density(alpha = 0.35, color = "white", linewidth = 0.5) + # 坐标轴配置 scale_x_continuous(name = "压力得分") + scale_y_continuous(name = "概率密度") + # 自定义图例配置 scale_fill_brewer( palette = "Set2", name = "样本所属分组", # 手动调整图例顺序,对比逻辑更清晰 breaks = c("对照组整体", "研究组男性", "研究组女性") ) + # 主题优化 theme_minimal() + theme( legend.position = "bottom", panel.grid.minor = element_blank() )
关键注意事项
- 不要图省事直接在同一个ggplot里叠加两个分别引用不同数据源的
geom_density:这种写法会因为两个图层的fill映射逻辑完全独立,生成两套分离的图例框,一套带性别标签、一套没有任何标注,手动调整很难对齐,本质就是两个图层没有共用统一的分组映射逻辑 - 预处理阶段提前剔除缺失值,避免密度计算时因有效样本量不一致出现曲线偏移、带宽适配错误
- 半透明填充的alpha值建议设置在0.3-0.4区间,既可以透过填充层看到重叠区域的分布差异,也不会因颜色过深遮挡不同曲线的轮廓边界
内容的提问来源于stack exchange,提问作者Chiao
相关产品推荐
相关产品推荐

