matplotlib показать много изображений в одной странице pdf

учитывая изображение неизвестного размера в качестве входных данных, следующее python скрипт показывает его 8 раз в одном pdf страницы:

pdf = PdfPages( './test.pdf' )
gs = gridspec.GridSpec(2, 4)

ax1 = plt.subplot(gs[0])
ax1.imshow( _img )

ax2 = plt.subplot(gs[1])
ax2.imshow( _img )

ax3 = plt.subplot(gs[2])
ax3.imshow( _img )

# so on so forth...

ax8 = plt.subplot(gs[7])
ax8.imshow( _img )

pdf.savefig()
pdf.close()

входное изображение может иметь разный размер (неизвестно априори). Я попытался использовать функцию gs.update(wspace=xxx, hspace=xxx) чтобы изменить расстояние между изображениями, надеясь, что matplotlib будет автоматически изменять размер и распространять изображения, чтобы иметь наименьшее возможное пространство. Однако, как вы можете видеть ниже, это не сработало, как я ожидал.

Is есть лучший способ добиться следующего?

  1. есть изображения, сохраненные с максимальным разрешением можно
  2. есть меньше свободного пространства возможно

В идеале я хотел бы, чтобы 8 изображений полностью будет размер страницы pdf (с минимальным количеством необходимой маржи).

enter image description here

enter image description here

1 ответов


Вы были на правильном пути: hspace и wspace управление пробелами между изображениями. Вы также можете управлять полями на рисунке с помощью top, bottom, left и right:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib.image as mimage
from matplotlib.backends.backend_pdf import PdfPages

_img = mimage.imread('test.jpg')

pdf = PdfPages( 'test.pdf' )
gs = gridspec.GridSpec(2, 4, top=1., bottom=0., right=1., left=0., hspace=0.,
        wspace=0.)

for g in gs:
    ax = plt.subplot(g)
    ax.imshow(_img)
    ax.set_xticks([])
    ax.set_yticks([])
#    ax.set_aspect('auto')

pdf.savefig()
pdf.close()

результат:

enter image description here

если вы хотите, чтобы ваши изображения действительно охватывали все доступное пространство, вы можете установить соотношение сторон в auto:

ax.set_aspect('auto')

результат:

enter image description here