Matplotlib的matshow不与网格对齐

时间:2015-03-05 18:39:15

标签: python numpy matplotlib

我有一个代表网格的6x6矩阵。在该网格的一部分上,我有一个较小的网格(3x3),如下所示:

In [65]:

arr = np.zeros((6,6))
arr[0:3, 0:3] = 1
arr
Out[65]:
array([[ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]])

我希望对此进行策划,但matplotlib会错误地将其设为错误,如下所示。红色正方形应该覆盖水平轴和垂直轴上从0到3的区域。

In [88]:

plt.matshow(arr)
plt.grid()

enter image description here

我该如何解决这个问题?谢谢

2 个答案:

答案 0 :(得分:7)

您可以使用标记的主要刻度和网格的次刻度。

考虑:

import matplotlib.pyplot as plt
import numpy as np

arr = np.zeros((6,6))
arr[0:3, 0:3] = 1

plt.matshow(arr)

# This is very hack-ish
plt.gca().set_xticks([x - 0.5 for x in plt.gca().get_xticks()][1:], minor='true')
plt.gca().set_yticks([y - 0.5 for y in plt.gca().get_yticks()][1:], minor='true')
plt.grid(which='minor')

plt.show()

显示:

Output

诀窍就是这两行:

plt.gca().set_xticks(..., minor='true')
plt.grid(which='minor')

答案 1 :(得分:3)

如果您愿意,可以使用:

matshow(arr, extent=[0, 6, 0, 6])

但是,标准行为符合预期:以(0,0)为中心的像素具有元素(0,0)的值。