Как сделать размер сюжета одинаковым? - PullRequest
3 голосов
/ 09 марта 2019

Я использую matplotlib и GridSpec, чтобы нанести 9 изображений на 3x3.

    fig = plt.figure(figsize=(30,40))
    fig.patch.set_facecolor('white')
    gs1 = gridspec.GridSpec(3,3)
    gs1.update(wspace=0.05, hspace=0.05)
    ax1 = plt.subplot(gs1[0])
    ax2 = plt.subplot(gs1[1])
    ax3 = plt.subplot(gs1[2])
    ax4 = plt.subplot(gs1[3])
    ax5 = plt.subplot(gs1[4])
    ax6 = plt.subplot(gs1[5])
    ax7 = plt.subplot(gs1[6])
    ax8 = plt.subplot(gs1[7])
    ax9 = plt.subplot(gs1[8])
    ax1.imshow(img1,cmap='gray')
    ax2.imshow(img2,cmap='gray')
    ...
    ax9.imshow(img9,cmap='gray')

Однако изображения имеют разный размер для каждой строки.Например, размер изображения в первой строке составляет 256x256, изображения во второй строке имеют размер 200x200, а третья строка имеет размер 128x128

. Я хочу нанести изображения в подзаголовок с тем же размером,Как я должен использовать это в Python?Спасибо

Это пример участка 4x3 enter image description here

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Полагаю, вы хотите показывать изображения разных размеров, чтобы все пиксели разных изображений были одинакового размера.

Это, как правило, сложно, но для случая, когда все изображения в строке (или столбце) сетки подзаговоров имеют одинаковый размер, это становится легко. Идея может состоять в том, чтобы использовать аргумент height_ratios (или width_ratios в случае столбцов) в gridspec и установить его в высоту (ширину) изображения.

import matplotlib.pyplot as plt
import numpy as np

images = [np.random.rand(r,r) for r in [25,20,12] for _ in range(3)]


r = [im.shape[0] for im in images[::3]]
fig, axes = plt.subplots(3,3, gridspec_kw=dict(height_ratios=r, hspace=0.3))

for ax, im in zip(axes.flat, images):
    ax.imshow(im)


plt.show()

enter image description here

2 голосов
/ 09 марта 2019

Не используйте matplotlib.gridspec, но используйте figure.add_subplot, как показано с приведенным ниже рабочим кодом. Тем не менее, при выполнении некоторых графиков, вам нужно set_autoscale_on(False), чтобы подавить его поведение регулировки размера.

import numpy as np
import matplotlib.pyplot as plt

# a function that creates image array for `imshow()`
def make_img(h):
    return np.random.randint(16, size=(h,h)) 

fig = plt.figure(figsize=(8, 12))
columns = 3
rows = 4
axs = []

for i in range(columns*rows):
    axs.append( fig.add_subplot(rows, columns, i+1) )

    # axs[-1] is the new axes, write its title as `axs[number]`
    axs[-1].set_title("axs[%d]" % (i))

    # plot raster image on this axes
    plt.imshow(make_img(i+1), cmap='viridis', alpha=(i+1.)/(rows*columns))

    # maniputate axs[-1] here, plot something on it
    axs[-1].set_autoscale_on(False)   # suppress auto sizing
    axs[-1].plot(np.random.randint(2*(i+1), size=(i+1)), color="red", linewidth=2.5)


fig.subplots_adjust(wspace=0.3, hspace=0.4)
plt.show()

Полученный участок:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...