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

如何在Matplotlib中为部分依赖图添加平滑的点密度颜色梯度

如何在Matplotlib中为部分依赖图添加平滑的点密度颜色梯度

嗨,我来帮你搞定这个需求!你现在用散点图展示部分依赖的预测值密度,想要换成平滑的颜色梯度填充,其实用**核密度估计(KDE)**就能完美解决,这是生成平滑密度热力图的常用方法,还能轻松叠加均值线来突出整体趋势。

下面我给你一步步拆解实现方法,附完整代码示例,你可以直接替换成自己的数据:

核心思路

  1. 用核密度估计(KDE)对x特征值和预测值的联合分布建模,生成平滑的密度值网格
  2. 用Matplotlib的contourf绘制平滑的密度填充区域,替代零散的散点
  3. 计算并叠加x分箱的预测值均值线,清晰展示整体依赖趋势

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# ----------------------
# 替换成你实际的x_values和predictions
# ----------------------
np.random.seed(42)  # 固定随机种子方便复现
x_values = np.random.uniform(0, 10, 1000)  # 你的特征变量
# 模拟部分依赖的预测值:随x线性变化+噪声,替换成你真实的回归预测结果
predictions = 2 * x_values + np.random.normal(0, 3, 1000)

# 1. 创建覆盖数据范围的网格点
x_min, x_max = x_values.min(), x_values.max()
y_min, y_max = predictions.min(), predictions.max()
# 生成100x100的网格,数值越大越平滑(但计算量也会增加)
xi, yi = np.meshgrid(np.linspace(x_min, x_max, 100),
                     np.linspace(y_min, y_max, 100))

# 2. 计算联合核密度估计
# 把x和y数据堆叠成KDE需要的格式
data = np.vstack([x_values, predictions])
kde = gaussian_kde(data)
# 计算每个网格点的密度值
zi = kde(np.vstack([xi.flatten(), yi.flatten()]))
# 把密度值重塑成网格形状
zi = zi.reshape(xi.shape)

# 3. 绘制平滑的密度填充图
plt.figure(figsize=(10, 6))
# 使用contourf填充,levels控制平滑层级(越多越细腻),cmap选颜色映射
density_fill = plt.contourf(xi, yi, zi, levels=20, cmap='viridis', alpha=0.8)
# 添加颜色条,说明密度高低
plt.colorbar(density_fill, label='预测值密度')

# 4. 计算并绘制x分箱的均值线(突出整体趋势)
# 把x分成20个等距分箱,你可以根据数据调整数量
x_bins = np.linspace(x_min, x_max, 20)
# 给每个x值分配对应的分箱索引
bin_indices = np.digitize(x_values, x_bins)
# 计算每个分箱内的预测值均值
mean_predictions = []
for i in range(1, len(x_bins)):
    bin_data = predictions[bin_indices == i]
    if len(bin_data) > 0:  # 跳过空分箱
        mean_predictions.append(bin_data.mean())
# 取分箱的中心值作为x坐标
bin_centers = (x_bins[:-1] + x_bins[1:]) / 2

# 绘制均值线,用对比鲜明的颜色突出
plt.plot(bin_centers, mean_predictions, color='white', linewidth=2, label='预测值均值')

# 5. 调整图表细节
plt.xlabel('特征值')
plt.ylabel('回归预测值')
plt.title('带平滑密度梯度的部分依赖图')
plt.legend()
plt.tight_layout()
plt.show()

关键细节说明

  • KDE平滑度控制:你可以调整gaussian_kde的bw_method参数来控制带宽,比如kde = gaussian_kde(data, bw_method=0.5),带宽越小越贴近原始数据,越大则整体平滑度越高。
  • 颜色映射选择:把cmap='viridis'换成其他你喜欢的配色,比如'plasma'、'magma'或者'coolwarm',根据图表的使用场景和视觉偏好调整。
  • 均值线优化:如果不想用分箱均值,也可以用滑动窗口均值(比如np.convolve实现),但分箱方式更简单直观,适合大部分部分依赖图的场景。
  • 轻量替代方案:如果KDE计算速度慢,也可以用plt.hexbin()生成六边形分箱的密度图,虽然不是完全平滑,但也比散点图美观,代码实现更简洁。

这样生成的图就是你想要的平滑颜色梯度填充,既能清晰展示每个x值对应的预测值分布密度,又能通过均值线突出整体的部分依赖趋势,比单个散点图美观太多啦!

备注:内容来源于stack exchange,提问作者Connor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:03:12