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

如何用ggplot2制作带渐变效果的美观部分重叠2D密度图?

解决ggplot2 2D密度图内深外浅渐变问题

你遇到的核心问题是geom_density_2d的alpha是全局参数,无法直接为每条轮廓线单独设置透明度。要实现内圈深、外圈浅的效果,需要将密度线的分位数(level)映射到透明度或颜色,具体可以用以下两种方案:

方案1:渐变线条版本

通过合并数据集统一处理分组,利用after_stat(level)获取每条密度线的分位数,将其映射到alpha,实现内圈(高level)透明度高、外圈(低level)透明度低的渐变效果:

library(ggplot2)
library(dplyr)

# 合并两个数据集并添加分组标识
combined_data <- bind_rows(
  control_group %>% mutate(group = "Control"),
  syn_group %>% mutate(group = "Syn")
)

# 绘制渐变线条的2D密度图
ggplot(combined_data, aes(x = eTIV, y = global_SA, color = group, alpha = after_stat(level))) +
  stat_density_2d(bins = 4, size = 1) +
  # 自定义分组颜色
  scale_color_manual(values = c("Control" = "blue", "Syn" = "red")) +
  # 设置透明度范围:level值越大(内圈),透明度越高(颜色越深)
  scale_alpha_continuous(range = c(0.3, 0.9)) +
  xlim(1000000, 2000000) +
  ylim(140000, 200000) +
  theme_classic() +
  guides(alpha = "none") # 隐藏透明度图例,避免干扰

方案2:填充渐变版本

如果需要填充效果,同样利用分位数映射透明度,用多边形图层实现内深外浅的填充:

ggplot(combined_data, aes(x = eTIV, y = global_SA, fill = group, alpha = after_stat(level))) +
  stat_density_2d(geom = "polygon", bins = 4) +
  scale_fill_manual(values = c("Control" = "blue", "Syn" = "red")) +
  scale_alpha_continuous(range = c(0.2, 0.7)) +
  xlim(1000000, 2000000) +
  ylim(140000, 200000) +
  theme_classic() +
  guides(alpha = "none")

关键说明

  • after_stat(level)是ggplot2的统计变量,代表每条密度线对应的密度分位数,数值越大表示该线越靠近密度分布的中心。
  • 通过将level映射到alpha,可以让中心区域的线条/填充透明度更高(颜色更深),外围区域逐渐变浅,提升重叠分布的辨识度。

内容的提问来源于stack exchange,提问作者Jamie Ward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:48:38