Почему моя сетка смещена в этом примере?

Я пытаюсь нарисовать случайно занятую сетку с matplotlib. Сетка выглядит смещенной от блоков случайным количеством:

Сетки

Вот код:

import matplotlib.pyplot as plt import numpy as np # Make a 10x10 grid... nrows, ncols = 10,10 # Fill the cells randomly with 0s and 1s image = np.random.randint(2, size = (nrows, ncols)) # Make grid vgrid = [] for i in range(nrows + 1): vgrid.append((i - 0.5, i - 0.5)) vgrid.append((- 0.5, 9.5)) hgrid = [] for i in range(ncols + 1): hgrid.append((- 0.5, 9.5)) hgrid.append((i - 0.5, i - 0.5)) row_labels = range(nrows) col_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'j'] plt.matshow(image, cmap='Greys') for i in range(11): plt.plot(hgrid[2 * i], hgrid[2 * i + 1], 'k-') plt.plot(vgrid[2 * i], vgrid[2 * i + 1], 'k-') plt.axis([-0.5, 9.5, -0.5, 9.5]) plt.xticks(range(ncols), col_labels) plt.yticks(range(nrows), row_labels) plt.show() 

Проблема, похоже, происходит, когда я применяю участок графика; эта строка:

 plt.axis([-0.5, 9.5, -0.5, 9.5]) 

Кроме того, не стесняйтесь предлагать лучший метод. Я новичок в pyplot.

Вы можете использовать plt.grid() для построения сетки осей. К сожалению, это не решит проблему. imshow сетки является известной проблемой для imshow (функция, вызываемая matshow ).

Я предлагаю играть с размером фигуры и шириной линии сетки, пока вы не получите что-то приемлемое.

 plt.figure(figsize=(5,5)); nrows, ncols = 10,10 image = np.random.randint(2, size = (nrows, ncols)) row_labels = range(nrows) col_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'j'] plt.matshow(image, cmap='Greys',fignum=1,interpolation="nearest") #set x and y ticks and labels plt.xticks(range(ncols), col_labels) plt.yticks(range(nrows), row_labels); #set minor axes in between the labels ax=plt.gca() ax.set_xticks([x-0.5 for x in range(1,ncols)],minor=True ) ax.set_yticks([y-0.5 for y in range(1,nrows)],minor=True) #plot grid on minor axes plt.grid(which="minor",ls="-",lw=2) 

введите описание изображения здесь

Это известное поведение, потому что по умолчанию matshow() вызывает imshow() с аргументом interpolation="nearest" . Вы должны получить лучшие результаты, переопределив аргумент вручную:

 plt.matshow(image, cmap='Greys', interpolation="none")