#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')
Выход: