Matplotlib热图中如何将坐标轴标签置于网格线中间?
解决方案
要实现标签位于两条网格线中间的需求,核心是把网格线位置和刻度标签位置分开控制——原来的代码中两者绑定在一起,导致标签和网格线重合。可以通过以下两种方式实现:
方法1:独立绘制网格线,自定义标签位置
直接用vlines和hlines绘制网格线,然后将刻度标签设置在你需要的中间位置(比如区间中点):
import numpy as np import matplotlib.pyplot as plt data = np.random.rand(640, 640) fig, ax = plt.subplots() im = ax.imshow(data, cmap='coolwarm') # 绘制网格线,位置保留358和589 grid_pos = [358, 589] ax.vlines(grid_pos, ymin=0, ymax=639, color='black', linestyle='--', linewidth=1, alpha=0.5) ax.hlines(grid_pos, xmin=0, xmax=639, color='black', linestyle='--', linewidth=1, alpha=0.5) # 计算标签位置:这里取0-358的中点、358-589的中点作为标签位置 tick_pos = [(0 + grid_pos[0])/2, (grid_pos[0] + grid_pos[1])/2] ax.set_xticks(tick_pos) ax.set_yticks(tick_pos) ax.set_xticklabels([999, 1023]) ax.set_yticklabels([999, 1023]) plt.show()
方法2:利用主次刻度分离网格和标签
保留原有的网格设置,将主刻度用于显示网格,隐藏主刻度标签;然后用次刻度放置你需要的标签:
import numpy as np import matplotlib.pyplot as plt data = np.random.rand(640, 640) fig, ax = plt.subplots() im = ax.imshow(data, cmap='coolwarm') # 主刻度设置为网格线位置,显示网格 ax.set_xticks([358, 589]) ax.set_yticks([358, 589]) ax.grid(which='major', color='black', linestyle='--', linewidth=1, alpha=0.5) # 隐藏主刻度标签 ax.set_xticklabels([]) ax.set_yticklabels([]) # 次刻度设置为两条网格线的区间中点,显示自定义标签 tick_pos = [(0 + 358)/2, (358 + 589)/2] ax.set_xticks(tick_pos, minor=True) ax.set_yticks(tick_pos, minor=True) ax.set_xticklabels([999, 1023], minor=True) ax.set_yticklabels([999, 1023], minor=True) plt.show()
如果你的需求是把两个标签都放在两条网格线的正中间(即(358+589)/2 = 473.5位置),只需要把tick_pos改成[473.5],但这种情况两个标签会重叠,建议根据实际需求选择区间中点的设置方式。
内容的提问来源于stack exchange,提问作者user3901294
相关产品推荐
相关产品推荐

