非规则形状数据的热力图绘制问题求助
解决方案
1. 整理数据为二维网格
首先把一维的xs、ys、corrs转换成二维数组,同时将y > x的区域标记为NaN(绘图时会自动显示空白):
import numpy as np import matplotlib.pyplot as plt # 生成x轴基础数据 X = np.linspace(0.1, 5, 25) corr_grid = [] Y_grid = [] # 循环计算每个x对应的y和相关值(替换成你的实际计算逻辑) for x in X: y_vals = np.linspace(0.01, x, 25) Y_grid.append(y_vals) # 替换为你的function_to_calculate_corr corr_vals = np.random.rand(25) # 示例随机值 corr_grid.append(corr_vals) # 转换为numpy二维数组 X_grid = np.repeat(X[:, np.newaxis], 25, axis=1) Y_grid = np.array(Y_grid) corr_grid = np.array(corr_grid) # 标记y > x的区域为NaN,绘图时自动留白 mask = Y_grid > X_grid corr_grid[mask] = np.nan
2. 使用pcolormesh绘制热力图
pcolormesh支持不规则网格的精准绘制,直接传入二维的X、Y和对应相关值数组即可:
plt.figure(figsize=(10, 8)) # 绘制热力图,可自定义配色、网格线样式 pcm = plt.pcolormesh(X_grid, Y_grid, corr_grid, cmap='viridis', edgecolors='white', linewidth=0.5) # 添加颜色条 plt.colorbar(pcm, label='Correlation') # 绘制y=x对角线,明确区分空白区域 plt.plot(X, X, 'r--', label='y = x') # 设置轴标签与标题 plt.xlabel('X') plt.ylabel('Y') plt.title('Correlation Heatmap (y ≤ x)') plt.legend() plt.show()
3. 备选方案:用tripcolor处理非结构化数据
如果不想整理成二维网格,可直接用tripcolor处理一维数据,自动适配空白区域:
plt.figure(figsize=(10, 8)) tc = plt.tripcolor(xs, ys, corrs, cmap='viridis', shading='flat') plt.colorbar(tc, label='Correlation') plt.plot(X, X, 'r--') plt.xlabel('X') plt.ylabel('Y') plt.title('Correlation Heatmap (y ≤ x)') plt.xlim(0.1, 5) plt.ylim(0.01, 5) plt.show()
关键说明
- 将
y > x区域设为NaN是实现留白的核心,matplotlib会自动跳过这些点的渲染。 pcolormesh更适合这种每行y范围不同的网格,能精准对应每个(x,y)的相关值。- 若你的
function_to_calculate_corr支持向量化运算,建议直接用二维数组计算,避免循环提升效率。
内容的提问来源于stack exchange,提问作者Roberto Corral
相关产品推荐
相关产品推荐

