Python中为散点图添加基于中位数距离的背景Colormap
实现带平滑背景色图的散点/折线图
要实现你需要的效果,我们可以通过创建高分辨率的背景网格,基于每个点与中位数的偏离程度映射颜色,再叠加原有的数据图。以下是完整的实现代码:
import numpy as np import matplotlib.pyplot as plt # 原始数据 x = np.arange(0,11) y = [3.03533424, 3.22326981, 3.05219723, 4.5, 3.21876807, 3.14124761, 3.43615915, 3.21650377, 3.2924148 , 3.30075672, 5.7] median_y = np.median(y) # 创建高分辨率的网格(分辨率远高于原始数据点) x_highres = np.linspace(x.min(), x.max(), 200) # x轴200个点 y_highres = np.linspace(min(y) - 0.5, max(y) + 0.5, 200) # y轴扩展范围并设200个点 X, Y = np.meshgrid(x_highres, y_highres) # 计算每个网格点到中位数的偏离程度(绝对值,偏离越远值越大) deviation = np.abs(Y - median_y) # 创建画布 fig, ax = plt.subplots(figsize=(10,6)) # 绘制背景色图(zorder设为0,确保在最底层) pcm = ax.pcolormesh(X, Y, deviation, cmap='RdYlBu_r', alpha=0.3, zorder=0) # 叠加原始折线和散点 ax.plot(x, y, marker='o', color='k', linewidth=2, zorder=2) # 绘制中位数线 ax.axhline(median_y, color='blue', label='Median', linewidth=2, zorder=1) # 添加颜色条,标注偏离程度 cbar = plt.colorbar(pcm) cbar.set_label('Deviation from Median', fontsize=12) # 设置图表标签 ax.set_xlabel('X', fontsize=12) ax.set_ylabel('Y', fontsize=12) ax.set_title('Parameter Performance vs Deviation from Median', fontsize=14) ax.legend() plt.show()
关键细节说明:
- 高分辨率网格:用
np.linspace生成远多于原始数据点的密集网格(这里设为200个点),保证背景色图的平滑效果。 - 偏离度计算:用
np.abs(Y - median_y)衡量每个点与中位数的距离,距离越大,颜色越深,直观体现"偏离越远表现越差"的趋势。 - 配色方案:使用
RdYlBu_r(反向的红-黄-蓝配色),中位数附近颜色最浅,偏离越远颜色越深;你可以替换成其他配色,比如viridis_r、coolwarm等。 - 层级控制:通过
zorder参数确保背景色图在最底层(zorder=0),中位数线在中间(zorder=1),原始数据图在最上层(zorder=2),避免遮挡。 - alpha参数:设置背景色图的透明度,让前景数据更清晰可见。
内容的提问来源于stack exchange,提问作者VictorSalles
相关产品推荐
相关产品推荐

