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

R ggplot2能否叠加两个同二元结果变量的条件密度图?

R ggplot2 叠加配对条件密度图实现方法

核心逻辑:你当前的两个条件密度图分别对应a、b两个独立数值列,直接叠加会因为x轴映射不一致无法对齐,需要先把宽格式数据转成长格式,统一x轴映射,再通过图层叠加+视觉属性区分两个变量的密度曲线。

可复现代码

# 加载依赖包
require(ggplot2)
require(tidyr)

# 生成示例数据(和你提供的示例一致,加随机种子方便复现结果)
set.seed(123)
a <- runif(200, min=0, max = 1000)
b <- runif(200, min=0, max = 1000)
c <- sample(c("A", "B"), 200, replace =T)
df <- data.frame(a,b,c)

# 宽表转长表:合并a、b数值列,新增var_type列标记数值来源
df_long <- pivot_longer(df, cols = c(a, b), names_to = "var_type", values_to = "x_val")

# 分层叠加绘图
ggplot(df_long, aes(x = x_val)) +
  # 第一层:绘制变量a的填充条件密度,用填充色区分c的A/B分组
  geom_density(
    data = ~subset(.x, var_type == "a"),
    aes(fill = c),
    position = "fill",
    alpha = 0.4
  ) +
  # 第二层:叠加变量b的条件密度,用描边色区分c的A/B分组,不填充避免遮挡下层
  geom_density(
    data = ~subset(.x, var_type == "b"),
    aes(color = c),
    position = "fill",
    linewidth = 1.2,
    fill = NA
  ) +
  # 配置图例和标签
  scale_fill_brewer(palette = "Set1", name = "c分组(变量a)") +
  scale_color_brewer(palette = "Dark2", name = "c分组(变量b)") +
  labs(x = "变量数值", y = "归一化条件密度占比") +
  theme_minimal()

自定义调整要点

  • 视觉区分方式可按需修改:如果不喜欢描边+填充的组合,也可以给两个图层都设置填充,将上层图层透明度调到0.2以下,同时给linetype(线型)映射var_type变量,靠实线/虚线区分a、b两个变量的密度区域
  • 多组批量绘图:如果有大量配对变量需要对比,可以封装自定义函数,传入两个待对比的列名即可自动生成叠加图,减少重复代码
  • 尺度对齐要求:两个图层必须使用完全一致的position参数,这里统一用position="fill"保证y轴都是0-1的归一化占比,避免上下层错位

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:48:14