Построение изображений бок о бок с помощью matplotlib

Мне было интересно, как я могу изображать изображения бок о бок, используя matplotlib, например, что-то вроде этого:

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

Самое близкое, что я получил, это:

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

Это было сделано с использованием этого кода:

f, axarr = plt.subplots(2,2)
axarr[0,0] = plt.imshow(image_datas[0])
axarr[0,1] = plt.imshow(image_datas[1])
axarr[1,0] = plt.imshow(image_datas[2])
axarr[1,1] = plt.imshow(image_datas[3])

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

Ответ 1

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь назначить возврат imshow (который является matplotlib.image.AxesImage к существующему объекту осей.

Правильный способ построения графических данных для разных осей в axarr будет

f, axarr = plt.subplots(2,2)
axarr[0,0].imshow(image_datas[0])
axarr[0,1].imshow(image_datas[1])
axarr[1,0].imshow(image_datas[2])
axarr[1,1].imshow(image_datas[3])

Концепция одинакова для всех подзаговоров, и в большинстве случаев экземпляр осей предоставляет те же методы, что и интерфейс pyplot (plt). Например. если ax является одной из ваших осей подзадачи, для построения нормального участка линии используйте ax.plot(..) вместо plt.plot(). Фактически это можно найти точно в источнике от страницы, на которую вы ссылаетесь.

Ответ 2

Вы рисуете все свои изображения на одной оси. То, что вы хотите, чтобы получить дескриптор для каждой оси отдельно и нарисовать свои изображения там. Например:

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax1.imshow(...)
ax2 = fig.add_subplot(2,2,2)
ax2.imshow(...)
ax3 = fig.add_subplot(2,2,3)
ax3.imshow(...)
ax4 = fig.add_subplot(2,2,4)
ax4.imshow(...)

Для получения дополнительной информации смотрите здесь: http://matplotlib.org/examples/pylab_examples/subplots_demo.html

Для сложных макетов вам следует использовать gridspec: http://matplotlib.org/users/gridspec.html

Ответ 3

Одна вещь, которую я нашел весьма полезной для использования:

_, axs = plt.subplots(n_row, n_col, figsize=(12, 12))
axs = axs.flatten()
for img, ax in zip(imgs, axs):
    ax.imshow(img)
    plt.show()

Ответ 4

Ответ YellowPillow нуждается в небольшой коррекции.

_, axs = plt.subplots(n_row, n_col, figsize=(12, 12))
axs = axs.flatten()
for img, ax in zip(imgs, axs):
    ax.imshow(img)
plt.show()