So entfernen Sie Achsen, Legenden und weiße Polsterung
Lesezeit: 6 Minuten
Sonnenmatte
Ich möchte Colormap auf ein Bild anwenden und das resultierende Bild schreiben, ohne Achsen, Beschriftungen, Titel oder irgendetwas zu verwenden, das automatisch von matplotlib hinzugefügt wird. Folgendes habe ich getan:
Es entfernt erfolgreich die Achse der Figur, 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)?
Alle Lösungen zu dieser Frage stehen im Fokus imshow. Wenn Sie stattdessen ein Streudiagramm haben, hilft Ihnen möglicherweise die folgende Antwort: stackoverflow.com/a/40727744/4124317
– ImportanceOfBeingErnest
21. November 2016 um 19:21 Uhr
Süchtig
Das axis('off') -Methode löst eines der Probleme prägnanter als das separate Ändern jeder Achse und jedes Randes. Es lässt jedoch immer noch den weißen Raum um den Rand herum. Hinzufügen bbox_inches="tight" zum savefig Befehl bringt Sie fast dorthin; Sie können im Beispiel unten sehen, dass der verbleibende Leerraum viel kleiner, aber immer noch vorhanden ist.
Neuere Versionen von matplotlib erfordern möglicherweise bbox_inches=0 statt der Schnur 'tight' (über @episodeyang und @kadrach)
from numpy import random
import matplotlib.pyplot as plt
data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches="tight")
Nach dem Vorschlag von unutbu könnten Sie verwenden fig = plt.figure(), ax = plt.axes([0,0,1,1])dann plt.imshow(data,interpolation="nearest". Kombiniert mit plt.axis("off")es sollte hoffentlich alles außer dem Bild selbst loswerden!
– PhilMacKay
22. Juli 2013 um 19:45 Uhr
Die Kombination der Methoden aus der Frage ({fig.axes.get_xaxis().set_visible(False) & fig.axes.get_yaxis().set_visible(False)} mit {plt.axis(‘off’)}) hat das Problem für behoben mich. (Keine Leerzeichen mehr). Und vergessen Sie nicht, Ihre {pad_inches} in savefig auf 0 zu setzen.
– Domagoj
28. Oktober 2014 um 14:09 Uhr
Ich bin gerade auf dieses Problem gestoßen, keine der Lösungen in diesem Thread und den verlinkten hat funktioniert. Allerdings explizit angeben bbox_inches=0 hat es geschafft.
– kadrach
23. Februar 2015 um 4:13 Uhr
Beachten Sie, dass Sie, wenn Sie Dinge über die plt.imshow ‘zeichnen’, wie in plt.plot(x,y), sicherstellen müssen, dass Sie xlim und ylim auf die Größe der Matrix setzen.
– Mathusalem
23. August 2016 um 16:00 Uhr
das geht nicht mehr. Ich habe eine Stunde gebraucht, um es herauszufinden. Siehe Antwort unten.
Ich bin mir ziemlich sicher, dass Sie die richtige Antwort haben (obwohl es wahrscheinlich mehr als eine Möglichkeit gibt), aber ich frage mich, ob Sie es erklären können warum es ist die richtige Antwort? Was ist mit Ihrem Code entfernt den Leerraum?
– Jan
15. Februar 2012 um 15:13 Uhr
@Yann, zusätzlich zur Dokumentation finde ich es sehr hilfreich, jeweils eine Zeile auszukommentieren, um zu sehen, welche Auswirkungen jeder Befehl hat. Es ist der empirische Weg!
– unutbu
15. Februar 2012 um 18:43 Uhr
Die Linie, die den weißen Rand entfernt, ist 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.
– PhilMacKay
22. Juli 2013 um 19:40 Uhr
Dies ist die richtigere Antwort, da sie nicht nur Leerzeichen für das gespeicherte Bild, sondern auch für Diagramme auf dem Bildschirm entfernt.
– MaxNoe
15. August 2015 um 12:36 Uhr
Danke, das ist die EINZIGE Lösung, die auf meinem Ubuntu gut funktioniert 🙂
– AlphaGoMK
15. November 2019 um 1:52 Uhr
Domagoj
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 Rahmen.
Ihre Methode hat alle Leerzeichen um dieses Bild entfernt, gute Arbeit, aber ich weiß immer noch nicht, warum Sie den Befehl hinzufügen fig.axes.get_xaxis().set_visible(False) lösen Sie das Problem. Vielen Dank
– ollydbg23
13. Dezember 2014 um 8:18 Uhr
Ja, wenn Sie diesen Befehl nicht aufrufen, werden die meisten Leerzeichen entfernt. In meinem Fall gab es jedoch noch einige Leerzeichen zwischen meinem Plot und dem Rand des .png-Bildes (vielleicht 2 Pixel breit). Durch den Aufruf der folgenden Befehle habe ich diese hartnäckigen Leerzeichen beseitigt.
– Domagoj
18. Dezember 2014 um 18:15 Uhr
Beachten Sie jedoch, dass das Obige bei Vorhandensein mehrerer Achsen in derselben Figur fehlschlägt (in meinem Fall ein eingebettetes Bild in der Handlung). Lösung: fig.axes[0]und generell alle oder ausgewählte Achsen.
– 0 _
6. Juni 2015 um 21:38 Uhr
Luator
Niemand erwähnt imsave doch, was dies zu einem Einzeiler macht:
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(10000).reshape((100, 100))
plt.imsave("/tmp/foo.png", data, format="png", cmap="hot")
Es speichert das Bild direkt so, wie es ist, dh es werden keine Achsen oder Ränder/Auffüllungen hinzugefügt.
plt.figure()
plt.imshow(bck)
plt.axis("off") # turns off axes
plt.axis("tight") # gets rid of white border
plt.axis("image") # square up the image instead of filling the "figure" space
plt.show()
Vlady Veselinov
Dies sollte alle Polsterungen und Ränder entfernen:
from matplotlib import pyplot as plt
fig = plt.figure()
fig.patch.set_visible(False)
ax = fig.add_subplot(111)
plt.axis('off')
plt.imshow(data)
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig("../images/test.png", bbox_inches=extent)
Unterschätzte Antwort! Das hat mich zu 99% des Weges dorthin gebracht. Sollte besser bewertet werden, weil es am aktuellsten ist
– Nathan
1. April 2019 um 18:19 Uhr
Es funktioniert auch, wenn Sie kein Axes-Objekt haben (ax) mit extent = plt.gca().get_window_extent().transformed(fig.dpi_scale_trans.inverted()).
– Toast
7. August 2019 um 1:59 Uhr
13995800cookie-checkSo entfernen Sie Achsen, Legenden und weiße Polsterungyes
Alle Lösungen zu dieser Frage stehen im Fokus
imshow
. Wenn Sie stattdessen ein Streudiagramm haben, hilft Ihnen möglicherweise die folgende Antwort: stackoverflow.com/a/40727744/4124317– ImportanceOfBeingErnest
21. November 2016 um 19:21 Uhr