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
相关产品推荐
相关产品推荐

