如何在Matplotlib彩色网格上绘制指定坐标点?
解决matplotlib网格图叠加指定点的问题
首先修正原代码中的变量名冲突:函数参数的x和y被循环内的同名变量覆盖,会导致后续坐标轴设置出错,先把循环变量改名。
接下来,添加绘制指定点的逻辑:需要将用户看到的标签坐标(如(4,2))转换为matplotlib实际的绘图坐标,再用scatter或plot绘制点,同时设置更高的zorder确保点显示在网格上方。
修改后的完整代码
import matplotlib import matplotlib.pyplot as plt def generate_grid(x, y, data, points=None): fig, ax = plt.subplots(1, 1, tight_layout=True) my_cmap = matplotlib.colors.ListedColormap(['grey']) my_cmap.set_bad(color='w', alpha=0) # 修复变量名冲突:用i、j代替原循环中的x、y for i in range(x + 1): ax.axhline(i, lw=2, color='k', zorder=5) for j in range(y + 1): ax.axvline(j, lw=2, color='k', zorder=5) ax.imshow(data, interpolation='none', cmap=my_cmap, extent=[0, y, 0, x], zorder=0) plt.locator_params(axis="x", nbins=y+1) # 修正原代码错误:x轴范围是0到y,刻度数量对应y+1 plt.locator_params(axis="y", nbins=x+1) locs, labels = plt.xticks() labels = [int(item)+1 for item in locs] plt.xticks(locs, labels) locs, labels = plt.yticks() z = len(locs) labels = [z - int(item) for item in locs] plt.yticks(locs, labels) ax.xaxis.tick_top() # 绘制指定点 if points is not None: for (x_label, y_label) in points: # 转换为实际绘图坐标 actual_x = x_label - 1 # x标签 = 实际坐标 +1 → 实际坐标 = 标签 -1 actual_y = z - y_label # y标签 = 刻度总数 - 实际坐标 → 实际坐标 = 刻度总数 - 标签 # 用scatter画点,设置颜色、大小和层级(确保在网格上方) ax.scatter(actual_x, actual_y, color='red', s=100, zorder=6) plt.show()
关键说明
- 变量名修复:将循环中的
x、y改为i、j,避免覆盖函数参数导致逻辑错误。 - 坐标轴参数修正:原代码中
plt.locator_params(axis="x", nbins=x+1)是错误的,x轴范围是0到y,所以刻度数量应设为y+1,保证标签显示正确。 - 坐标转换逻辑:
- x轴:用户看到的标签 = 实际绘图坐标 + 1,因此实际坐标 = 标签值 - 1
- y轴:用户看到的标签 = 刻度总数 - 实际绘图坐标,因此实际坐标 = 刻度总数 - 标签值
- 点的层级控制:设置
zorder=6(高于网格的zorder=5),确保点显示在网格上方。
调用示例
假设你有一个5行4列的网格(x=5, y=4),要在(4,2)、(2,1)位置画点:
import numpy as np # 生成示例数据:5行4列,部分位置设为灰色(有效),其余为白色(无效) data = np.full((5,4), np.nan) data[2,3] = 1 # 对应标签坐标(4, 5+1-2)=(4,4),仅作示例 # 调用函数并传入指定点 generate_grid(x=5, y=4, data=data, points=[(4,2), (2,1)])
内容的提问来源于stack exchange,提问作者sarakkal107
相关产品推荐
相关产品推荐

