Scipy: savefig без фреймов, осей, только контент
В numpy/scipy у меня есть изображение, хранящееся в массиве. Я могу отобразить его, я хочу сохранить его с помощью savefig
без каких-либо границ, осей, меток, названий,... Просто чистый образ, ничего другого.
Я хочу избегать пакетов типа PyPNG
или scipy.misc.imsave
, они иногда проблематичны (они не всегда хорошо устанавливаются, только базовые savefig()
для меня
Ответы
Ответ 1
Предполагая:
import matplotlib.pyplot as plt
Чтобы сделать фигуру без рамки:
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
Чтобы содержимое заполнило всю фигуру
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
Затем нарисуйте на нем свое изображение:
ax.imshow(your_image, aspect='normal')
fig.savefig(fname, dpi)
Параметр aspect
изменяет размер пикселя, чтобы убедиться, что он заполняет размер фигуры, указанный в fig.set_size_inches(…)
. Чтобы понять, как играть с такими вещами, прочитайте matplotlib documentation, особенно по теме Axes, Axis и Artist.
Ответ 2
Более легкое решение выглядит следующим образом:
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
Ответ 3
Вы можете найти 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)
Я узнал этот трюк от Джо Кингтона здесь.
Ответ 4
Я пробовал несколько вариантов в моем случае, и лучшим решением было следующее:
fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)
затем сохраните фигуру с помощью savefig
Ответ 5
Я предложу ответ 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)
Ответ 6
Эта работа для меня
plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
Ответ 7
У меня была такая же проблема при выполнении некоторой визуализации, используя 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()
Ответ 8
Хотя приведенные выше ответы касаются удаления полей и отступов, они не помогли мне удалить ярлыки. Вот что сработало для тех, кто позже наткнется на этот вопрос:
Предполагая, что вам нужна сетка 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')
Ответ 9
Для тех, кто пытается сделать это в Jupyter
plt.axis('off')
spec = plt.imshow
plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
Ответ 10
Я тоже пытался избавиться от границы, используя подсказки, но ничего не получалось. Возникло некоторое беспокойство, и я обнаружил, что изменение лицевого цвета не дало мне никаких границ в лабораториях Юпитера (любой цвет приводил к избавлению от белой границы). Надеюсь это поможет.
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()
![enter image description here]()