Как удалить промежутки между * изображениями * в matplotlib?

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

В моем примере игрушек у меня есть четыре изображения, которые я хочу разместить в два ряда. Они имеют разные формы: различное количество строк, одинаковое количество столбцов . Несмотря на различия, они должны соответствовать единице без пробелов, как на следующем рисунке:

это подходит

Когда я пытаюсь собрать их вместе, установка plt.subplots_adjust(wspace=0, hspace=0) не делает трюк, потому что изображения имеют разные формы.

Вот код:

 from numpy.random import rand import matplotlib.pyplot as plt test_data = [[rand(10,10), rand(10,10)],[rand(5,10), rand(5,10)]] f, axarr = plt.subplots(2,2) for i in range(2): for j in range(2): axarr[i, j].imshow(test_data[i][j]) plt.tight_layout() plt.subplots_adjust(wspace=0, hspace=0) plt.show() 

Я пробовал играть с set_aspect и equal , но без везения.

nofits

Кто-нибудь знает, как получить эти пробелы?

Вы можете установить height_ratios подзаговоров с gridspec_kw аргумента gridspec_kw в вызове plt.subplots и использовать высоты разных изображений для установки этого отношения.

От документов до plt.subplots() :

gridspec_kw: dict, необязательный

Dict с ключевыми словами, переданными в конструктор GridSpec, используемый для создания сетки, на которой размещаются подзаголовки.

Обратите внимание, что ваш пример имел точный формат изображения по умолчанию matplotlib, поэтому вы не заметите появления каких-либо пробелов, пока вы не добавите больше строк или не измените формы изображений.

Таким образом, чтобы расширить это до общего решения, вам нужно будет установить размер фигуры в соответствии с формами изображений. Например, давайте расширим ваш пример до 3 строк, 2 столбца. Мы также будем явно устанавливать ширину фигуры на 8 дюймов и настраивать высоту в зависимости от размеров изображения.

 from numpy.random import rand import matplotlib.pyplot as plt test_data = [[rand(10,10), rand(10,10)],[rand(5,10), rand(5,10)],[rand(2,10), rand(2,10)]] cmaps = [['viridis', 'binary'], ['plasma', 'coolwarm'], ['Greens', 'copper']] heights = [a[0].shape[0] for a in test_data] widths = [a.shape[1] for a in test_data[0]] fig_width = 8. # inches fig_height = fig_width * sum(heights) / sum(widths) f, axarr = plt.subplots(3,2, figsize=(fig_width, fig_height), gridspec_kw={'height_ratios':heights}) for i in range(3): for j in range(2): axarr[i, j].imshow(test_data[i][j], cmap=cmaps[i][j]) axarr[i, j].axis('off') plt.subplots_adjust(wspace=0, hspace=0, left=0, right=1, bottom=0, top=1) plt.show() 

введите описание изображения здесь

Вы можете объединить все изображения в один массив, который вы затем imshow с помощью imshow .
Чтобы убедиться, что между изображением нет дополнительного интервала, нам нужно рассчитать соотношение сторон и установить размер фигуры соответственно. (Чтобы показать, что я изменил число пикселей нижних изображений на 4).

 from numpy.random import rand import matplotlib.pyplot as plt import numpy as np test_data = [[rand(10,10), rand(10,10)],[rand(4,10), rand(4,10)]] a = np.c_[np.array(test_data[0][0]),np.array(test_data[0][1]) ] b = np.c_[np.array(test_data[1][0]),np.array(test_data[1][1]) ] c = np.r_[a,b] dpi=100 width = 5 #inch height = width*c.shape[0]/float(c.shape[1]) fig, ax = plt.subplots(figsize=(width,height ), dpi=dpi) ax.imshow(c) ax.axis("off") plt.subplots_adjust(0,0,1,1) plt.savefig(__file__+".png") plt.show() 

введите описание изображения здесь