如何在Matplotlib中为部分依赖图添加平滑的点密度颜色梯度
如何在Matplotlib中为部分依赖图添加平滑的点密度颜色梯度
嗨,我来帮你搞定这个需求!你现在用散点图展示部分依赖的预测值密度,想要换成平滑的颜色梯度填充,其实用**核密度估计(KDE)**就能完美解决,这是生成平滑密度热力图的常用方法,还能轻松叠加均值线来突出整体趋势。
下面我给你一步步拆解实现方法,附完整代码示例,你可以直接替换成自己的数据:
核心思路
- 用核密度估计(KDE)对x特征值和预测值的联合分布建模,生成平滑的密度值网格
- 用Matplotlib的
contourf绘制平滑的密度填充区域,替代零散的散点 - 计算并叠加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
相关产品推荐
相关产品推荐

