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

如何在ggplot2与R中创建带颜色渐变的二维密度图

实现类别专属的渐变二维密度图

要实现你想要的效果——每个类别(A/B)的密度峰值用指定深色调,随密度降低逐渐透明,核心是为每个类别独立计算密度,并将透明度绑定到密度值,而不是直接用alpha=cat。下面提供两种可行方案:

方案1:手动计算密度(更灵活)

通过MASS::kde2d手动计算每个类别的二维密度,再用栅格图绘制:

# 加载所需包
library(ggplot2)
library(dplyr)
library(MASS)

# 为每个类别生成密度网格数据
density_grid <- df %>%
  group_by(cat) %>%
  group_modify(~{
    # 计算二维核密度,n控制网格精细度
    kde_result <- kde2d(.x$x, .x$y, n = 100)
    # 整理成ggplot可用的数据框
    expand.grid(x = kde_result$x, y = kde_result$y) %>%
      mutate(density = as.vector(kde_result$z), cat = .y$cat)
  })

# 绘制渐变密度图
ggplot(density_grid, aes(x = x, y = y)) +
  # 用栅格图展示,interpolate让颜色过渡更平滑
  geom_raster(aes(fill = cat, alpha = density), interpolate = TRUE) +
  # 指定类别对应的基础颜色:A为深橙色,B为深青色
  scale_fill_manual(values = c("A" = "#ff7f0e", "B" = "#1f78b4")) +
  # 设置透明度范围:密度最高时完全不透明,最低时完全透明
  scale_alpha_continuous(range = c(0, 1)) +
  theme_minimal() +
  labs(x = "X轴", y = "Y轴", fill = "类别")

方案2:用ggplot内置统计变换(更简洁)

直接借助stat_density_2d完成密度计算和绘图,无需额外数据整理:

library(ggplot2)

ggplot(df, aes(x = x, y = y)) +
  # 调用密度统计,用tile展示,关闭等高线
  stat_density_2d(aes(fill = cat, alpha = after_stat(density)),
                  geom = "tile", contour = FALSE, n = 100) +
  # 自定义类别颜色
  scale_fill_manual(values = c("A" = "#ff7f0e", "B" = "#1f78b4")) +
  # 调整透明度与密度的绑定关系
  scale_alpha_continuous(range = c(0, 1)) +
  theme_minimal()

关键说明

  • 两种方案都实现了每个类别独立计算密度,避免了不同类别密度相互干扰的问题。
  • alpha=density将透明度与密度值绑定:密度越高,透明度越低(颜色越深),完全符合你想要的“峰值深、低峰透明”的效果。
  • 调整n参数可以控制网格精细度,值越大颜色过渡越平滑,但计算时间会略有增加。

内容的提问来源于stack exchange,提问作者Drew Steen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:20:56