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

如何在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()

关键说明

  1. 变量名修复:将循环中的x、y改为i、j,避免覆盖函数参数导致逻辑错误。
  2. 坐标轴参数修正:原代码中plt.locator_params(axis="x", nbins=x+1)是错误的,x轴范围是0到y,所以刻度数量应设为y+1,保证标签显示正确。
  3. 坐标转换逻辑:
    • x轴:用户看到的标签 = 实际绘图坐标 + 1,因此实际坐标 = 标签值 - 1
    • y轴:用户看到的标签 = 刻度总数 - 实际绘图坐标,因此实际坐标 = 刻度总数 - 标签值
  4. 点的层级控制:设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:26:07