如何设置matplotlib的pcolormesh热力图刻度标签居中对齐对应色块
问题解决方法
问题根源
pcolormesh的默认轴刻度由matplotlib自动生成,不会默认仅展示你传入的坐标对应刻度,也不会自动对齐到色块中心:
- 官方示例里的x/y是等间隔均匀分布,matplotlib自动生成的刻度刚好和你的坐标重合,所以看起来效果正常
- 自定义数据如果间隔特殊或者数量少,自动生成的刻度就会和预期不符,还会出现多余刻度
解决方案
直接手动指定刻度位置和标签即可,不需要修改pcolormesh的核心参数,修改后的完整代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap data = pd.DataFrame(index=[0, 0.25, 0.5], data={0: [31.40455938, 101.43291831, 101.67128077], 0.25: [31.40455938, 89.81448724, 99.65066293], 0.5: [31.40455938, 57.01406046, 101.47536496]}) x = data.columns.astype(np.float64).to_numpy() y = data.index.astype(np.float64).to_numpy() z = data.to_numpy() cmap = LinearSegmentedColormap.from_list('G2R', ["green", "red"]) fig, ax = plt.subplots() ax.pcolormesh(x, y, z, shading='auto', cmap=cmap, edgecolors='w', linewidths=0.5, vmin=0, vmax=100) # 新增两行手动设置刻度,即可实现居中对齐+仅展示指定刻度 ax.set_xticks(x) ax.set_yticks(y) # 如果需要自定义标签(比如字符串标签),再加下面两行替换即可 # ax.set_xticklabels(['标签1', '标签2', '标签3']) # ax.set_yticklabels(['标签A', '标签B', '标签C']) ax.set_title('expected effect') ax.set_xlabel('X') ax.set_ylabel('Y') plt.show()
字符串刻度处理逻辑
如果你的刻度是字符串类型(比如分类标签),只需要先传入和标签数量一致的整数作为x/y坐标,再替换刻度标签即可,示例如下:
# 假设x轴标签是["样本1", "样本2", "样本3"],y轴标签是["组A", "组B", "组C"] x = np.arange(3) y = np.arange(3) z = np.random.rand(3,3) fig, ax = plt.subplots() ax.pcolormesh(x, y, z, shading='auto', edgecolors='w') ax.set_xticks(x) ax.set_xticklabels(["样本1", "样本2", "样本3"]) ax.set_yticks(y) ax.set_yticklabels(["组A", "组B", "组C"]) plt.show()
内容的提问来源于stack exchange,提问作者erzwo
相关产品推荐
相关产品推荐

