scipy: savefig без фреймов, осей, только контент - PullRequest
65 голосов
/ 22 ноября 2011

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

Ответы [ 10 ]

86 голосов
/ 22 ноября 2011

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

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 , особенно по теме Axes, Axis и Artist.

54 голосов
/ 04 декабря 2012

Более простое решение:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
24 голосов
/ 22 ноября 2011

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

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

15 голосов
/ 12 августа 2015

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

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

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

8 голосов
/ 15 сентября 2015

Я предложу ответ 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)
4 голосов
/ 10 апреля 2018

Эта работа для меня

plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
3 голосов
/ 22 марта 2017

У меня была такая же проблема при выполнении некоторой визуализации с использованием 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 голосов
/ 29 апреля 2018

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

Предполагая, что вам нужна сетка 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')
0 голосов
/ 07 июля 2019

Я тоже пытался избавиться от границы, используя подсказки, но ничего не получалось.Возникло некоторое беспокойство, и я обнаружил, что изменение лицевого цвета не дало мне никаких границ в лабораториях Юпитера (любой цвет приводил к избавлению от белой границы).Надеюсь, это поможет.

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

0 голосов
/ 14 июня 2019

Для тех, кто пытается сделать это в Jupyter

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...