Scipy: savefig без фреймов, осей, только контент

В numpy/scipy у меня есть изображение, хранящееся в массиве. Я могу отобразить его, я хочу сохранить его с помощью savefig без каких-либо границ, осей, меток, названий,... Просто чистый образ, ничего другого.

Я хочу избегать пакетов типа PyPNG или scipy.misc.imsave, они иногда проблематичны (они не всегда хорошо устанавливаются, только базовые savefig() для меня

4b9b3361

Предполагая:

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.

54
ответ дан 22 нояб. '11 в 0:38
источник

Более легкое решение выглядит следующим образом:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
35
ответ дан 04 дек. '12 в 19:51
источник

Вы можете найти 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)

Я узнал этот трюк от Джо Кингтона здесь.

18
ответ дан 22 нояб. '11 в 1:06
источник

Я пробовал несколько вариантов в моем случае, и лучшим решением было следующее:

fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

затем сохраните фигуру с помощью savefig

4
ответ дан 12 авг. '15 в 3:15
источник

Я предлагаю ответить heron13 с небольшим добавлением, заимствованным из здесь, чтобы удалить остальную часть после установки bbox в жесткий режим, поэтому:

fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
3
ответ дан 15 сент. '15 в 11:54
источник

У меня была такая же проблема при выполнении некоторой визуализации, используя 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()
2
ответ дан 22 марта '17 в 5:23
источник