Matplotlib绘制在包围边缘的2d网格中采取的路径

问题描述 投票:1回答:1

我有一个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!

python numpy matplotlib
1个回答
1
投票

看起来你正在寻找np.insert。它完全符合你的要求。您可以使用diff获取np.nonzero返回+/- 1以外的位置的索引。第一个返回值将是行索引,无论中断发生在哪个方向。由于insert假设您在插入点之后指定索引,因此diff中的索引必须加1:

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

© www.soinside.com 2019 - 2024. All rights reserved.