it-swarm.com.de

scipy: savefig ohne Frames, Achsen, nur Inhalt

In Numpy/Scipy habe ich ein Bild in einem Array gespeichert. Ich kann es anzeigen, ich möchte es mit savefigohne beliebigen Rahmen, Achsen, Bezeichnungen, Titeln, ... speichern. Nur ein reines Bild, sonst nichts.

Ich möchte Pakete wie PyPNG oder scipy.misc.imsave Vermeiden, sie sind manchmal problematisch (sie lassen sich nicht immer gut installieren, nur grundlegende savefig() für mich

66
Jakub M.

Vorausgesetzt:

import matplotlib.pyplot as plt

So machen Sie eine Figur ohne Rahmen:

fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)

Damit der Inhalt die ganze Figur ausfüllt

ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)

Dann zeichne dein Bild darauf:

ax.imshow(your_image, aspect='normal')
fig.savefig(fname, dpi)

Mit dem Parameter aspect wird die Pixelgröße geändert, um sicherzustellen, dass sie die in fig.set_size_inches(…) angegebene Bildgröße erfüllt. Um ein Gefühl dafür zu bekommen, wie man mit solchen Dingen spielt, lesen Sie matplotlibs Dokumentation , insbesondere zum Thema Axes, Axis und Artist.

89
matehat

Eine einfachere Lösung scheint zu sein:

fig.savefig('out.png', bbox_inches='tight', pad_inches=0)
55
weatherfrog

Sie finden die bbox des Bildes innerhalb der Achse (mit get_window_extent) und benutze den bbox_inches Parameter, um nur diesen Teil des Bildes zu speichern:

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)

Ich habe diesen Trick von Joe Kington gelernt hier .

24
unutbu

Ich habe in meinem Fall mehrere Optionen ausprobiert und die beste Lösung war diese:

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

dann speichere deine Figur mit savefig

15
Cagri Sarigoz

Ich schlage heron13 vor, mit einem kleinen Zusatz aus hier zu antworten, um die Polsterung zu entfernen, die nach dem Einstellen der bbox in den engen Modus verbleibt. Deshalb:

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)
8

Dieser arbeitet für mich

plt.savefig('filename',bbox_inches='tight',transparent=True, pad_inches=0)
4
Cathy Yang

Ich hatte das gleiche Problem bei der Visualisierung mit librosa , wo ich den Inhalt des Plots ohne weitere Informationen extrahieren wollte. Das ist also mein Ansatz. unutbu Antwort hilft mir auch, zur Arbeit zu machen.

    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()
3
GPrathap

Während die obigen Antworten das Entfernen von Rändern und Auffüllungen betrafen, funktionierten sie für mich beim Entfernen von Etiketten nicht. Folgendes funktionierte für alle, die später auf diese Frage stoßen:

Angenommen, Sie möchten ein 2x2-Raster von Unterplots aus vier in images gespeicherten Bildern:

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')
2
curious

Für alle, die dies in Jupyter versuchen

 plt.axis('off')

 spec = plt.imshow

 plt.savefig('spec',bbox_inches='tight',transparent=True, pad_inches=0)
1
Krackle

Ich habe versucht, die Grenze auch loszuwerden, indem ich hier Tipps gegeben habe, aber nichts hat wirklich funktioniert. Ein bisschen rumgespielt und ich fand, dass das Ändern der Gesichtsfarbe mir in Jupyter Labs keinen Rand gab (jede Farbe führte dazu, dass der weiße Rand entfernt wurde). Hoffe das hilft.

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
Atom Scott