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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:21:03