Ich bin neu in Python und Matplotlib. Ich möchte einfach eine Farbkarte auf ein Bild anwenden und das resultierende Bild schreiben, ohne Achsen, Beschriftungen, Titel oder irgendetwas zu verwenden, das normalerweise automatisch von matplotlib hinzugefügt wird. Folgendes habe ich getan:
def make_image(inputname,outputname):
data = mpimg.imread(inputname)[:,:,0]
fig = plt.imshow(data)
fig.set_cmap('hot')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig(outputname)
Die Achse der Figur wird erfolgreich entfernt, aber die gespeicherte Figur zeigt eine weiße Polsterung und einen Rahmen um das eigentliche Bild. Wie kann ich sie entfernen (zumindest die weiße Polsterung)? Vielen Dank
python
matplotlib
Sonnenmatte
quelle
quelle
imshow
. Wenn Sie stattdessen ein StreudiagrammAntworten:
Ich denke, dass der Befehl
axis('off')
eines der Probleme prägnanter behandelt, als jede Achse und den Rand separat zu ändern. Es bleibt jedoch immer noch der weiße Raum um die Grenze. Wenn Siebbox_inches='tight'
densavefig
Befehl hinzufügen, gelangen Sie fast dorthin. Im folgenden Beispiel sehen Sie, dass der verbleibende Leerraum viel kleiner ist, aber immer noch vorhanden ist.Beachten Sie, dass neuere Versionen von matplotlib möglicherweise
bbox_inches=0
anstelle der Zeichenfolge erforderlich sind'tight'
(über @episodeyang und @kadrach).quelle
fig = plt.figure()
,ax = plt.axes([0,0,1,1])
dannplt.imshow(data,interpolation="nearest"
. In Kombination mitplt.axis("off")
sollte es hoffentlich alles außer dem Bild selbst loswerden!bbox_inches=0
jedoch den Trick getan.Diesen Trick habe ich hier von matehat gelernt :
ergibt
quelle
plt.Axes(fig, [0,0,1,1])
. Dies weist matplotlib an, einen Satz von Achsen mit einer unteren linken Ecke an dem Punkt bei (0%, 0%) und einer Breite und Höhe von (100%, 100%) zu erstellen.Mögliche einfachste Lösung:
Ich habe einfach die in der Frage beschriebene Methode und die Methode aus der Antwort von Hooked kombiniert.
Nach diesem Code gibt es keine Leerzeichen und keinen Frame.
quelle
fig.axes.get_xaxis().set_visible(False)
das Problem löst. Dankefig.axes[0]
und im Allgemeinen alle oder ausgewählte Achsen.imsave
Noch niemand erwähnt , was dies zu einem Einzeiler macht:Das Bild wird direkt so gespeichert, wie es ist, dh es werden keine Achsen oder Rahmen / Auffüllungen hinzugefügt.
quelle
Sie können auch den Umfang der Abbildung für das
bbox_inches
Argument angeben . Dies würde die weiße Polsterung um die Figur herum beseitigen.quelle
Dies sollte alle Polster und Ränder entfernen:
quelle
ax
) mit habenextent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted())
.Ich fand, dass alles dokumentiert ist ...
https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.axis.html#matplotlib.axes.Axes.axis
Mein Code…. "bcK" ist ein 512 x 512 Bild
quelle
Ich mochte die Antwort von Ubuntu , aber sie zeigte nicht explizit, wie die Größe für nicht quadratische Bilder sofort eingestellt werden kann. Deshalb habe ich sie für einfaches Kopieren und Einfügen geändert:
Das Speichern von Bildern ohne Rahmen ist unabhängig von der gewählten Auflösung einfach, wenn pixel_size / dpi = size beibehalten wird.
Die Anzeige ist jedoch gruselig. Wenn Sie eine kleine Auflösung wählen, kann Ihre Bildgröße größer als Ihr Bildschirm sein und Sie erhalten während der Anzeige einen Rand. Dies hat jedoch keinen Einfluss auf das Speichern.
So für
Die Anzeige wird eingefasst (aber das Speichern funktioniert):
quelle
Die optimierte Antwort funktioniert nicht mehr. Damit es funktioniert, müssen Sie manuell eine Achse hinzufügen, die auf [0, 0, 1, 1] eingestellt ist, oder den Patch unter der Abbildung entfernen.
Alternativ können Sie den Patch auch einfach entfernen. Sie müssen keine Nebenhandlung hinzufügen, um die Auffüllungen zu entfernen. Dies wird durch die Antwort von Vlady unten vereinfacht
Dies wird mit der Version
3.0.3
am 19.06.2019 getestet . Bild siehe unten:Eine viel einfachere Sache ist die Verwendung
pyplot.imsave
. Für Details, Sie in der Antwort von luator untenquelle
Erstens für bestimmte Bildformate (z. B. TIFF) ) die Farbkarte tatsächlich in der Kopfzeile speichern, und die meisten Betrachter zeigen Ihre Daten mit der Farbkarte an.
Zum Speichern eines tatsächlichen
matplotlib
Bildes, das zum Hinzufügen von Anmerkungen oder anderen Daten zu Bildern hilfreich sein kann, habe ich die folgende Lösung verwendet:quelle
Vielen Dank für die tollen Antworten von allen ... Ich hatte genau das gleiche Problem damit, nur ein Bild ohne zusätzliche Polsterung / Platz usw. zeichnen zu wollen, also war ich super glücklich, hier alle Ideen zu finden.
Abgesehen von Bildern ohne Auffüllung wollte ich auch einfach Anmerkungen usw. hinzufügen können, die über ein einfaches Bilddiagramm hinausgehen.
Am Ende kombinierte ich Davids Antwort mit der von csnemes, um zur Zeit der Figurenerstellung einen einfachen Wrapper zu erstellen . Wenn Sie das verwenden, brauchen Sie später keine Änderungen mit imsave () oder irgendetwas anderem:
quelle