You need to enable JavaScript to run this app. 如何使用ggplot将跨两数据集的三组密度图合并绘图并配置图例
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 08:06:03