Лично я склонен использовать matplotlib.pyplot.subplots
для подобных ситуаций. Если ваши изображения действительно разнородны, это может быть лучшим выбором, чем подход, основанный на конкатенации изображений, в ответе, с которым вы связаны.
import matplotlib.pyplot as plt
from scipy.misc import face
x = 4
y = 4
fig,axarr = plt.subplots(x,y)
ims = [face() for i in range(x*y)]
for ax,im in zip(axarr.ravel(), ims):
ax.imshow(im)
fig.savefig('faces.png')
Моя большая жалоба на subplots
- это количество пробелов в полученном рисунке. Кроме того, для вашего приложения вы можете не хотеть тиков / кадров осей. Вот функция-обертка, которая решает эти проблемы:
import matplotlib.pyplot as plt
def savegrid(ims, rows=None, cols=None, fill=True, showax=False):
if rows is None != cols is None:
raise ValueError("Set either both rows and cols or neither.")
if rows is None:
rows = len(ims)
cols = 1
gridspec_kw = {'wspace': 0, 'hspace': 0} if fill else {}
fig,axarr = plt.subplots(rows, cols, gridspec_kw=gridspec_kw)
if fill:
bleed = 0
fig.subplots_adjust(left=bleed, bottom=bleed, right=(1 - bleed), top=(1 - bleed))
for ax,im in zip(axarr.ravel(), ims):
ax.imshow(im)
if not showax:
ax.set_axis_off()
kwargs = {'pad_inches': .01} if fill else {}
fig.savefig('faces.png', **kwargs)
Запуск savegrid(ims, 4, 4)
на том же наборе изображений, который использовался ранее, дает:
Если вы используете savegrid
, если вы хотите, чтобы каждое отдельное изображение занимало меньше места, передайте ключевое слово fill=False
arg. Если вы хотите показать тики / кадры осей, передайте showax=True
.