Я пытаюсь отобразить три изображения разного размера рядом, используя Matplotlib. Я хочу, чтобы каждый подзаголовок сохранял исходный размер изображений без автоматического масштабирования до одинакового размера.
img_512 = down_sample(1024, 512, img)
img_512_upsample = up_sample(512, 1024, img_512)
fig, ax = plt.subplots(1,3, figsize=(15,10))
ax[0].imshow(img, cmap='gray', aspect='equal', extent=[0, img.shape[1], img.shape[0], 0])
ax[0].set_title(f"Original Image")
ax[0].axis('on')
ax[1].imshow(img_512, cmap='gray', aspect='equal', extent=[0, img_512.shape[1], img_512.shape[0], 0])
ax[1].set_title(f"Down Sample to 512x512")
ax[1].axis('on')
ax[2].imshow(img_512_upsample, cmap='gray', aspect='equal', extent=[0, img_512_upsample.shape[1], img_512_upsample.shape[0], 0])
ax[2].set_title(f"Up Sample to 1024x1024")
ax[2].axis('on')
plt.autoscale(False)
plt.tight_layout()
plt.show()
Я попробовал отключить автоматическое масштабирование, установить равный формат и попытаться установить размер в соответствии с размерами изображений.
Вы можете отрегулировать положение средних осей, используя set_position:
import matplotlib.pyplot as plt
import numpy as np
img = np.zeros((1024, 1024))
img_512 = np.zeros((512, 512))
img_512_upsample = np.zeros((1024, 1024))
fig, ax = plt.subplots(1,3, figsize=(15,10))
ax[0].imshow(img, cmap='gray', aspect='equal', extent=[0, img.shape[1], img.shape[0], 0])
ax[0].set_title(f"Original Image")
ax[1].imshow(img_512, cmap='gray', aspect='equal', extent=[0, img_512.shape[1], img_512.shape[0], 0])
ax[1].set_title(f"Down Sample to 512x512")
ax[2].imshow(img_512_upsample, cmap='gray', aspect='equal', extent=[0, img_512_upsample.shape[1], img_512_upsample.shape[0], 0])
ax[2].set_title(f"Up Sample to 1024x1024")
pos = ax[1].get_position()
ax[1].set_position([pos.x0 + pos.width/4, pos.y0, pos.width/2, pos.height/2])
plt.show()
Если вы хотите применить плотный макет, обязательно сделайте это перед установкой позиции:
fig.tight_layout()
pos = ax[1].get_position()
ax[1].set_position([pos.x0 + pos.width/4, pos.y0, pos.width/2, pos.height/2])
(макет constrained
работает нормально, если установить plt.subplots
)
В общем случае, когда имеется больше подграфиков или когда вы хотите контролировать пространство между подграфиками, этот ручной метод быстро становится громоздким. В этом случае вы можете использовать набор инструментов axes_grid1
.
Если вы хотите, чтобы подграфики были одинакового размера, используйте sharex
/sharey
при вызове subplots
:
import matplotlib.pyplot as plt
import numpy as np
img = np.zeros((1024, 1024))
img_512 = np.zeros((512, 512))
img_512_upsample = np.zeros((1024, 1024))
fig, ax_arr = plt.subplots(1,3, figsize=(15,10), sharex=True, sharey=True)
ax_arr[0].imshow(img, cmap='gray', aspect='equal', extent=[0, img.shape[1], img.shape[0], 0])
ax_arr[0].set_title(f"Original Image")
ax_arr[1].imshow(img_512, cmap='gray', aspect='equal', extent=[0, img_512.shape[1], img_512.shape[0], 0])
ax_arr[1].set_title(f"Down Sample to 512x512")
ax_arr[2].imshow(img_512_upsample, cmap='gray', aspect='equal', extent=[0, img_512_upsample.shape[1], img_512_upsample.shape[0], 0])
ax_arr[2].set_title(f"Up Sample to 1024x1024")
plt.show()
Если вместо этого вы хотите, чтобы средний подграфик был вдвое меньше высоты и ширины, используйте width_ratios
в вызове подзаголовков:
fig, ax_arr = plt.subplots(1,3, figsize=(15,10), width_ratios=[2, 1, 2])
Вы можете выровнять подграфики по верхнему или нижнему краю, используя свойство привязки — «N» для севера или «S» для юга:
for ax in ax_arr:
ax.set_anchor("N")
что такое down_sample и up_sample? не забывайте всегда включать в свой вопрос весь соответствующий код