В numpy / scipy у меня есть изображение, хранящееся в массиве. Я могу отобразить его, я хочу сохранить его, используя savefig
без границ, осей, меток, заголовков ... Просто чистое изображение, ничего больше.
Я хочу избегать таких пакетов, как PyPNG
или scipy.misc.imsave
, они иногда являются проблематичными (они не всегда устанавливаются хорошо, только базовые savefig()
для меня
w
иh
параметрыfig.set_size_inches(w,h)
иdpi
параметрfig.savefig(fname, dpi)
так , что в результате 24px на 24px, он должен работать нормально. Например,w = h = 1
иdpi = 24
imshow
синтаксис изменен наaspect='auto'
вместо'normal'
).ax = plt.Axes(fig, [0., 0., 1., 1.])
это то, что заставляет его работать.Кажется, более легкое решение:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
источник
fig.savefig('out.png', bbox_inches='tight',transparent=True, pad_inches=0)
Вы можете найти bbox изображения внутри оси (используя
get_window_extent
) и использоватьbbox_inches
параметр для сохранения только этой части изображения:import numpy as np import matplotlib.pyplot as plt data=np.arange(9).reshape((3,3)) fig=plt.figure() ax=fig.add_subplot(1,1,1) plt.axis('off') plt.imshow(data) extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) plt.savefig('/tmp/test.png', bbox_inches=extent)
Я научился этому трюку от Джо Кингтона здесь .
источник
plt.axis('off')
помогло. Другие ответы не очень помогают.plt.savefig('/temp/test.png', bbox_inches='tight', transparent=True, pad_inches=0)
вместоplt.savefig('/tmp/test.png', bbox_inches=extent)
В моем случае я пробовал несколько вариантов, и лучшим решением было следующее:
fig.subplots_adjust(bottom = 0) fig.subplots_adjust(top = 1) fig.subplots_adjust(right = 1) fig.subplots_adjust(left = 0)
затем сохраните свою фигуру с помощью
savefig
источник
Я предлагаю ответ heron13 с небольшим дополнением, заимствованным отсюда, чтобы удалить отступы, оставшиеся после установки bbox в жесткий режим, поэтому:
axes = fig.axes() axes.get_xaxis().set_visible(False) axes.get_yaxis().set_visible(False) fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
источник
Эта работа для меня
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
источник
У меня была такая же проблема при визуализации с использованием librosa, когда я хотел извлечь содержимое графика без какой-либо другой информации. Таков мой подход. unutbu ответ также помогает мне заставить работать.
figure = plt.figure(figsize=(500, 600), dpi=1) axis = plt.subplot(1, 1, 1) plt.axis('off') plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off') # your code goes here. e.g: I used librosa function to draw a image result = np.array(clip.feature_list['fft'].get_logamplitude()[0:2]) librosa.display.specshow(result, sr=api.Clip.RATE, x_axis='time', y_axis='mel', cmap='RdBu_r') extent = axis.get_window_extent().transformed(figure.dpi_scale_trans.inverted()) plt.savefig((clip.filename + str("_.jpg")), format='jpg', bbox_inches=extent, pad_inches=0) plt.close()
источник
extent.get_points()*np.array([[1.1],[.9]])
.Для всех, кто пытается сделать это в Jupyter
plt.axis('off') spec = plt.imshow plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
источник
Хотя приведенные выше ответы касаются удаления полей и отступов, они не помогли мне удалить метки. Вот что сработало для тех, кто позже наткнется на этот вопрос:
Предположим, вам нужна сетка 2x2 подзаголовков из четырех изображений, хранящихся в
images
:matplotlib.pyplot.figure(figsize = (16,12)) # or whatever image size you require for i in range(4): ax = matplotlib.pyplot.subplot(2,2,i+1) ax.axis('off') imshow(images[i]) matplotlib.pyplot.savefig(path, bbox_inches='tight')
источник
Я тоже пытался избавиться от границы, используя советы, но ничего не помогло. Немного возился, и я обнаружил, что изменение цвета лица не давало мне границ в jupyter labs (любой цвет приводил к избавлению от белой границы). Надеюсь это поможет.
def show_num(data): data = np.rot90(data.reshape((16,16)), k=3) data = np.fliplr(data) fig = plt.figure(frameon=False, facecolor='white') ax = plt.Axes(fig, [0., 0., 1., 1.]) ax.set_axis_off() fig.add_axes(ax) ax.imshow(data) plt.show()
источник
На самом деле я пробовал это недавно, и вместо всех этих строк вы можете использовать
Работает как шарм. всего одна строчка и проблема решена.
Документация ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imsave.html )
источник
Для меня этот код сделал аналогичный размер входного изображения без рамки и осей из кодов matehat , unutbu и WHZW :
fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.axis('off') viridis = cm.get_cmap('gist_gray', 256) plt.imshow(data, aspect='auto', cmap=viridis) plt.tight_layout() plt.savefig(out_file, bbox_inches='tight', transparent=True, pad_inches=0)
Среда выполнения:
Python 3.6.10
Matplotlib 3.2.1
ОС Windows 10
источник