具有交替单元宽度的 pcolormesh

use*_*834 1 python matplotlib

我想制作一个 matplotlib colormesh,它不规则地缩放以使某些行和列比其他行和列更宽。

请记住,我对 matplotlib 不太熟悉,并且可能会忽略一个明显的解决方案。

假设我有以下代码:

plt.axes().set_aspect("equal")
maze = plt.pcolormesh(arr)
plt.show()
Run Code Online (Sandbox Code Playgroud)

其中arr是二维位数组,产生如下所示的颜色网格: 代表迷宫的颜色网格

我想减少每行和每列的宽度,以压缩上面迷宫的墙壁。

任何帮助将不胜感激,谢谢。

编辑:这是数据示例。它基本上只是一个由 1 和 0 组成的二维数组,但为了便于阅读,我已将其转换为字符串。

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   
0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   1   0   
0   1   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   0   
0   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   1   0   1   0   
0   1   0   1   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   0   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   0   0   0   0   1   0   1   0   1   0   1   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   0   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   0   0   0   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   0   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   0   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   1   0   1   1   1   0   
0   1   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   1   0   
0   1   1   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   0   1   1   1   0   
0   0   0   0   0   0   0   1   0   1   0   1   0   1   0   0   0   0   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   1   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   
0   1   0   0   0   0   0   1   0   1   0   1   0   1   0   0   0   0   0   1   0   1   0   1   0   1   0   0   0   1   0   1   0   
0   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   1   1   0   
0   1   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   1   0   1   0   1   0   
0   1   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   
0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   
0   1   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   
0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
Run Code Online (Sandbox Code Playgroud)

Joh*_*anC 5

plt.pcolormesh()可以使用 1 或 3 个未命名参数来调用。当只有 1 时,该参数应该是网格数据。当有 3 个时,前 2 个或网格线在 x 和 y 方向上的位置。

您可以通过平铺宽单元格和窄单元格的宽度来计算这些位置,然后计算累积和。请注意,网格位置需要比单元格数量多一个。因此,单元格的34网格线(或2*1733。如果x和y方向的单元格数量不相等,可以分别计算网格位置。

这是一个例子。选择宽度,使宽单元格和窄单元格占据 2 个单位,这将使轴坐标与示例类似。如果这些坐标不重要,您可以使用任何宽度。

import matplotlib.pyplot as plt
import numpy as np

arr = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0],[0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0],[0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0],[0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0],[0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0],[0,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,0],[0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0],[0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0],[0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,0],[0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0],[0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0],[0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])

dists = np.tile([1.6, 0.4], (arr.shape[0] + 1) // 2).cumsum()

plt.pcolormesh(dists, dists, arr)
plt.axis('equal')
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)

具有交替单元宽度的 pcolormesh