Ответ 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))
Я пытаюсь построить матрицу значений и хотел бы добавить линии сетки, чтобы сделать границу между значениями более четкими. К сожалению, имшоу решил найти отметки в середине каждого воксела. Возможно ли
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)
Изображение с линиями сетки в неправильном месте:
Попробуй сместить оси тиков:
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))
Код для решения, предложенный 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)
Можно проще использовать plt.pcolor
или plt.pcolormesh
:
data = np.random.rand(10, 10)
plt.pcolormesh(data, edgecolors='k', linewidth=2)
ax = plt.gca()
ax.set_aspect('equal')
Хотя между ними и plt.imshow
есть некоторые различия, наиболее очевидным из которых является то, что изображение plt.imshow
местами по оси Y ax.invert_yaxis()
хотя вы можете легко повернуть его обратно, добавив ax.invert_yaxis()
). Для дальнейшего обсуждения смотрите здесь: Когда использовать imshow вместо pcolormesh?
Вы можете сдвигать пикселы, передавая 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)