Настройка линий сетки и тиков в matplotlib imshow

Я пытаюсь построить матрицу значений и хотел бы добавить линии сетки, чтобы сделать границу между значениями более четкими. К сожалению, имшоу решил найти отметки в середине каждого воксела. Возможно ли

a) удалите тики, но оставьте метку в том же месте и
б) добавить сетчатые линии между границами пикселей?

import matplotlib.pyplot as plt
import numpy as np

im = plt.imshow(np.reshape(np.random.rand(100), newshape=(10,10)),
                    interpolation='none', vmin=0, vmax=1, aspect='equal');
ax = plt.gca();
ax.set_xticks(np.arange(0, 10, 1));
ax.set_yticks(np.arange(0, 10, 1));
ax.set_xticklabels(np.arange(1, 11, 1));
ax.set_yticklabels(np.arange(1, 11, 1));

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

ax.grid(color='w', linestyle='-', linewidth=2)

Изображение с линиями сетки в неправильном месте:

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

Ответ 1

Попробуй сместить оси тиков:

ax = plt.gca()
ax.set_xticks(np.arange(-.5, 10, 1))
ax.set_yticks(np.arange(-.5, 10, 1))
ax.set_xticklabels(np.arange(1, 12, 1))
ax.set_yticklabels(np.arange(1, 12, 1))

enter image description here

Ответ 2

Код для решения, предложенный Serenity:

plt.figure()
im = plt.imshow(np.reshape(np.random.rand(100), newshape=(10,10)),
                interpolation='none', vmin=0, vmax=1, aspect='equal');

ax = plt.gca();

# Major ticks
ax.set_xticks(np.arange(0, 10, 1));
ax.set_yticks(np.arange(0, 10, 1));

# Labels for major ticks
ax.set_xticklabels(np.arange(1, 11, 1));
ax.set_yticklabels(np.arange(1, 11, 1));

# Minor ticks
ax.set_xticks(np.arange(-.5, 10, 1), minor=True);
ax.set_yticks(np.arange(-.5, 10, 1), minor=True);

# Gridlines based on minor ticks
ax.grid(which='minor', color='w', linestyle='-', linewidth=2)

Результирующее изображение: enter image description here

Ответ 3

Можно проще использовать plt.pcolor или plt.pcolormesh:

data = np.random.rand(10, 10)
plt.pcolormesh(data, edgecolors='k', linewidth=2)
ax = plt.gca()
ax.set_aspect('equal')

enter image description here

Хотя между ними и plt.imshow есть некоторые различия, наиболее очевидным из которых является то, что изображение plt.imshow местами по оси Y ax.invert_yaxis() хотя вы можете легко повернуть его обратно, добавив ax.invert_yaxis()). Для дальнейшего обсуждения смотрите здесь: Когда использовать imshow вместо pcolormesh?

Ответ 4

Вы можете сдвигать пикселы, передавая extent аргумент imshow. extent представляет собой 4-элементный список скаляров (слева, справа, снизу, сверху):

foo = np.random.rand(35).reshape(5, 7)
# This keeps the default orientation (origin at top left):
extent = (0, foo.shape[1], foo.shape[0], 0)
_, ax = plt.subplots()
ax.imshow(foo, extent=extent)
ax.grid(color='w', linewidth=2)
ax.set_frame_on(False)

enter image description here