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

Python使用meshgrid绘制多个1x1正方形的问题求解

问题描述

需要使用meshgrid绘制多个尺寸为1x1的正方形,现有代码运行后仅显示方形标记点,未生成目标正方形,相关内容如下:

现有实现代码

import numpy as np
import matplotlib.pyplot as plt
X = np.array([0,1,2])
Y = np.array([0, -1, -2])
xx, yy = np.meshgrid(X,Y)
plt.plot(xx, yy,"s")
plt.show()

实际输出效果

实际输出效果

预期输出效果

预期输出效果

问题原因

plt.plot(xx, yy,"s")的作用是在meshgrid生成的每个网格坐标点上绘制方形散点标记,不会自动以这些点为锚点生成闭合的正方形图形,因此输出只有离散的方形点,无法得到连续的1x1正方形。

实现方案

提供两种可直接运行的实现方式:

  • 方式1:逐点绘制矩形 patch
    遍历所有网格点,以每个点为左下角顶点绘制宽、高均为1的矩形,代码逻辑直观易修改:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.patches import Rectangle
    
    X = np.array([0,1,2])
    Y = np.array([0, -1, -2])
    xx, yy = np.meshgrid(X,Y)
    
    fig, ax = plt.subplots()
    # 遍历所有网格点生成正方形
    for x, y in zip(xx.flatten(), yy.flatten()):
        ax.add_patch(Rectangle((x, y), width=1, height=1, edgecolor='black', facecolor='white'))
    
    # 调整坐标轴范围保证图形完整显示
    ax.set_xlim(X.min() - 0.1, X.max() + 1.1)
    ax.set_ylim(Y.min() - 1.1, Y.max() + 0.1)
    ax.set_aspect('equal')
    plt.show()
    

    注意:必须设置set_aspect('equal')锁定坐标轴等比例,否则正方形会被拉伸为长方形

  • 方式2:用pcolormesh直接绘制网格
    不需要逐点循环,直接通过网格生成色块,设置空心样式即可得到目标正方形,代码更简洁:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 网格边界需要比原坐标多一个点,对应正方形的外边界
    X = np.array([0,1,2,3])
    Y = np.array([-3,-2,-1,0])
    xx, yy = np.meshgrid(X,Y)
    
    fig, ax = plt.subplots()
    ax.pcolormesh(xx, yy, np.zeros(xx.shape), edgecolor='black', facecolor='none', linewidth=1)
    ax.set_aspect('equal')
    plt.show()
    

两种方式运行后都可以得到和预期一致的3行3列排列的1x1空心正方形。

内容的提问来源于stack exchange,提问作者Wiz123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:01:07