Matplotlib 用于绘制在环绕边缘的 2D 网格中采用的路径



我有一个 2D 32 x 32 环形网格世界。 一只蚂蚁可以环游世界,当到达边缘时,蚂蚁会绕到世界的另一端。 当我使用 Matplotlib 绘制此路径时:

path = [(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)]
ys_path, xs_path = np.array(path).T
axes.plot(xs_path, ys_path, '-')

每当蚂蚁绕到另一边时,我都会得到水平和垂直线。 知道我怎么不能通过世界中心连接点吗? 在图像中,红色圆圈是蚂蚁经过的所有方块。

如果连续之差的绝对值为 31,则在该位置插入 (np.nan, np.nan)。但我不知道该怎么做。

self.path excerpt:
array([[  0,   1],
[  0,   1],
[ 31,   0],  # at this point in path insert a np.nan tuple
[  0,  -1],
[  0,  -1],
[-31,   0],
[  0,   1],
[ 31,   0],
[ -1,   0],
[  0,   1],
[  0,   1],
[  0,   1],
[ -1,   0]])
path = np.array(self.path, dtype=np.float)
path = np.insert(path, 
np.nonzero(np.abs(np.diff(path, axis=0)) > 1)[0] + 1, np.nan, axis=0)
ys_path, xs_path = np.array(path).T  #flip i and j for coordinate system
axes.plot(xs_path+0.5, ys_path+0.5, '-') # centre in middle of square

这完成了我们想要的,它在路径数组中插入了一个 NaN 元组,Genius!

看起来你正在寻找np.insert.它完全符合您的要求。您可以获取diff返回 +/-1 以外的其他内容的位置的索引,并带有np.nonzero。第一个返回值将是行索引,无论中断发生在哪个方向。差异中的索引必须递增 1,因为insert运行时假设您在插入点之后指定索引:

path = np.array([(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)], dtype=np.float)
delta = np.diff(path, axis=0)
mask = (np.abs(delta) > 1)
row_indices = np.nonzero(mask)[0]
row_indices += 1
path = np.insert(path, row_indices, np.nan, axis=0)
...
axes.plot(*path.T, '-')

此代码为每个步骤保存一个临时变量,使其更易于遵循。当然,您可以根据您的需求和审美偏好将其变成单行或介于两者之间的东西:

path = np.array([(0, 1), (0, 2), (0, 3), (31, 3), (31, 2), (31, 1), (0, 1), (0, 2),
(31, 2), (30, 2), (30, 3), (30, 4), (30, 5), (29, 5)], dtype=np.float)
path = np.insert(path, np.nonzero(np.abs(np.diff(path, axis=0)) > 1)[0] + 1, np.nan, axis=0)
...
axes.plot(*path.T, '-')

根据您计划稍后如何使用path,可能根本不需要将其拆分为永久转置。您可以使用参数扩展将其作为两个单独的数组传递给axes.plot

最新更新