如何基于x、y坐标与概率值创建二维概率密度热力图
二维坐标概率热力图实现方案
数据预处理说明
你当前的x、y是一维数组,z也是一维的200个值,但热力图需要二维网格对应的概率矩阵。如果你的数据是离散的(x,y)点对应z值,需要通过插值生成二维网格的概率数据;如果是想生成x-y全网格的概率值,直接生成二维z数组即可。
方案1:基于离散点插值生成热力图
适用于你提供的离散(x,y,z)数据场景:
import numpy as np import random import matplotlib.pyplot as plt from scipy.interpolate import griddata # 生成原始数据 x = np.linspace(-1, 1, 200) y = np.linspace(-1, 1, 200) points = np.array([x, y]).T # 构造离散点坐标对 z = np.array([random.uniform(0, 1) for _ in range(200)]) # 生成x-y网格 X, Y = np.meshgrid(x, y) # 插值生成二维概率矩阵(cubic为三次插值,平滑度高;可选linear/nearest) Z = griddata(points, z, (X, Y), method='cubic') # 绘制热力图 plt.figure(figsize=(10, 8)) # 填充式热力图,levels控制颜色分层数,cmap指定配色方案 contour_plot = plt.contourf(X, Y, Z, cmap='viridis', levels=50) # 添加颜色条并标注含义 plt.colorbar(contour_plot, label='概率值') plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('二维坐标概率热力图') plt.show()
方案2:直接生成全网格热力图
如果你的需求是生成x-y所有网格点的概率值,直接构造二维z数组即可:
import numpy as np import matplotlib.pyplot as plt # 生成x-y网格 x = np.linspace(-1, 1, 200) y = np.linspace(-1, 1, 200) X, Y = np.meshgrid(x, y) # 生成200x200的二维概率数组 z = np.random.uniform(0, 1, (200, 200)) # 绘制热力图 plt.figure(figsize=(10, 8)) plt.pcolormesh(X, Y, z, cmap='viridis', shading='auto') plt.colorbar(label='概率值') plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('二维坐标概率热力图') plt.show()
参数调整建议
- 配色方案:
cmap可替换为plasma、inferno、magma、coolwarm等,适配不同视觉需求 - 平滑度:方案1中
method选cubic比linear更平滑;方案2可通过调整linspace的点数(比如从200改到300)提升精细度 - 颜色分层:
contourf的levels参数数值越大,颜色过渡越细腻
内容的提问来源于stack exchange,提问作者dcoolwater0502
相关产品推荐
相关产品推荐

