如何基于MultiIndex确定的数值范围绘制位置准确的热力图
问题原因
你用imshow出错的核心原因是imshow默认将输入的二维数组视为均匀等距的网格,每个网格单元的宽高完全一致。但你的数据里每行对应的y轴区间是不等宽的(示例里第一行y区间高度0.5,第二行高度1.5),imshow没法识别这种非均匀的区间划分,自然会出现色块大小错误、位置偏移的问题。
解决方法
改用matplotlib.pyplot.pcolormesh,这个接口支持自定义非均匀的坐标轴边界,可以完美适配你的数据结构。
实现代码
import numpy as np import matplotlib.pyplot as plt # 提取y轴边界:把前两列的所有边界值去重排序,刚好对应每个行的上下边界 y_bounds = np.sort(np.unique(df.iloc[:, [0,1]].values.flatten())) # 提取x轴边界:如果你的x列需要映射到1-80的范围,按列数生成等距边界即可 x_col_count = len(df.columns) - 2 x_bounds = np.linspace(1, 80, x_col_count + 1) # 提取需要绘制的数值矩阵 plot_data = df.iloc[:, 2:].values # 绘图 plt.axis([1, 80, 14, 32]) plt.pcolormesh( x_bounds, y_bounds, plot_data, cmap='rainbow', vmin=2.0, vmax=6.3 ) plt.gca().set_aspect(100/8) plt.show()
如果你的x轴也不是等距的,只需要把x_bounds换成你自己的x区间边界数组即可,pcolormesh支持x、y双维度的非均匀网格。
内容的提问来源于stack exchange,提问作者belst
相关产品推荐
相关产品推荐

