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

