Спецификация сетки Matplotlib: Почему эти подзаголовки изображений немного отличаются по высоте?

#python #matplotlib

Вопрос:

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

 import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize=(5,5))
gridspec.GridSpec(5, 5)

# plot the narrow plot
plt.subplot2grid((5, 5), (0,0), colspan=2, rowspan=5)
plt.imshow(np.random.normal(size=(5,2)))
plt.axis('off')

# plot the wide plot
plt.subplot2grid((5, 5), (0,2), colspan=3, rowspan=5)
plt.imshow(np.random.normal(size=(5,3)))
plt.axis('off')
 

И вот результирующий сюжет:

Два подзаголовка изображения, первый немного короче по высоте

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

Как мне это исправить? Я открыт для решений, отличных от GridSpec.

Комментарии:

1. По умолчанию imshow() используется aspect='equal' принудительное использование квадратных ячеек. Чтобы вписаться в прямоугольник, оставленный после заполнения, левое изображение необходимо немного уменьшить. Вы могли бы попытаться plt.imshow(..., aspect='auto') разрешить слегка прямоугольные ячейки. Или заставьте некоторые дополнительные отступы в вертикальном направлении ( plt.subplots_adjust(top=0.9) ?) Или измените размер рисунка, чтобы он был немного шире.

Ответ №1:

Как насчет этого?

 import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig, axs = plt.subplots(1,2,figsize=(5,5), gridspec_kw={'width_ratios': [2, 3]})
axs[0].imshow(np.random.normal(size=(5,2)))
axs[1].imshow(np.random.normal(size=(5,3)))
axs[0].axis('off')
axs[1].axis('off')
 

Выход:

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