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

如何优化散点式热力图,提升显著值可视性?

优化连续X/Y/Z数据的热力图显示,解决散点式问题

你的问题根源在于X和Y是连续变量,直接使用pivot_table会因X/Y取值不规整生成大量缺失值(转0后表现为图中空白区域),而imshow仅能展示规整网格数据,最终呈现散点状效果。预期的热力图需要对连续数据做网格化分箱统计或插值处理,以下是几种可行方案:

方案1:分箱统计(保留Z值的统计特征)

将X/Y划分为固定数量的网格,计算每个网格内Z值的均值(或求和、中位数),再用imshow绘制:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('L0.csv')
X = data.X
Y = data.Y
Z = data.Z

# 调整分箱数量控制热力图精细度
xbins = 100
ybins = 80

# 计算每个分箱的Z均值,同时统计分箱内的数据点数量
heatmap, xedges, yedges = np.histogram2d(X, Y, bins=(xbins, ybins), weights=Z)
counts, _, _ = np.histogram2d(X, Y, bins=(xbins, ybins))

# 避免除以0,无数据区域设为NaN后转0
heatmap = np.divide(heatmap, counts, where=counts != 0)
heatmap = np.nan_to_num(heatmap)

plt.grid(False)
plt.imshow(heatmap.T, extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]],
           origin='lower', cmap=plt.cm.jet, aspect='auto')
plt.colorbar()  # 添加色条增强可读性
plt.show()

方案2:插值生成规整网格(实现平滑热力图)

使用scipy.interpolate.griddata将离散的X/Y/Z插值到规整网格,得到平滑的热力图:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

data = pd.read_csv('L0.csv')
X = data.X
Y = data.Y
Z = data.Z

# 创建规整网格,调整数值控制精细度
xi = np.linspace(X.min(), X.max(), 200)
yi = np.linspace(Y.min(), Y.max(), 150)
xi, yi = np.meshgrid(xi, yi)

# 插值方法:linear(线性)/cubic(立方,更平滑)/nearest(最近邻)
zi = griddata((X, Y), Z, (xi, yi), method='cubic')
zi = np.nan_to_num(zi)

plt.grid(False)
plt.imshow(zi, extent=[X.min(), X.max(), Y.min(), Y.max()],
           origin='lower', cmap=plt.cm.jet, aspect='auto')
plt.colorbar()
plt.show()

方案3:hexbin快速绘制六边形热力图

无需手动处理网格,plt.hexbin直接对连续数据生成六边形分箱的热力图,效果接近预期:

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_csv('L0.csv')
X = data.X
Y = data.Y
Z = data.Z

plt.grid(False)
# gridsize控制六边形大小,reduce_C_function指定分箱内Z值的统计方式
hb = plt.hexbin(X, Y, C=Z, gridsize=50, cmap=plt.cm.jet,
                extent=[0, 15, -5, 3], reduce_C_function=np.mean)
plt.colorbar(hb)
plt.show()

额外优化建议

  • 调整分箱数/网格点数量,平衡热力图精细度与计算速度;
  • 替换色图为viridis等更友好的配色(jet存在视觉失真问题);
  • 若Z值范围差异大,用plt.clim(Z.min(), Z.quantile(0.95))设置色条上下限,过滤极端值干扰,突出显著区域。

内容的提问来源于stack exchange,提问作者Zolic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:38