So entfernen Sie Achsen, Legenden und weiße Polsterung

Lesezeit: 6 Minuten

Benutzeravatar von sunmat
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:

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)

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

Hookeds Benutzeravatar
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")

Geben Sie hier die Bildbeschreibung ein

  • 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.

    – episodeyang

    8. Mai 2019 um 3:32 Uhr

Benutzeravatar von unutbu
unutbu

Ich habe diesen Trick von Matehat gelernt, hier:

import matplotlib.pyplot as plt
import numpy as np

def make_image(data, outputname, size=(1, 1), dpi=80):
    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig, [0., 0., 1., 1.])
    ax.set_axis_off()
    fig.add_axes(ax)
    plt.set_cmap('hot')
    ax.imshow(data, aspect="equal")
    plt.savefig(outputname, dpi=dpi)

# data = mpimg.imread(inputname)[:,:,0]
data = np.arange(1,10).reshape((3, 3))

make_image(data, '/tmp/out.png')

Erträge

Geben Sie hier die Bildbeschreibung ein

  • 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

Benutzeravatar von Domagoj
Domagoj

Mögliche einfachste Lösung:

Ich habe einfach die in der Frage beschriebene Methode und die Methode aus der Antwort von Hooked kombiniert.

fig = plt.imshow(my_data)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('pict.png', bbox_inches="tight", pad_inches = 0)

Nach diesem Code gibt es keine Leerzeichen und keinen Rahmen.

Keine Leerzeichen, Achsen oder 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

Benutzeravatar von luator
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.

Geben Sie hier die Bildbeschreibung ein

plt.axis('off')

plt.savefig('example.png',bbox_inches="tight",pad_inches = 0)

bekommt mir das randlose Bild.

Benutzeravatar von paulj
paulj

Ich habe festgestellt, 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×512-Bild

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

Benutzeravatar von Vlady Veselinov
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

1399580cookie-checkSo entfernen Sie Achsen, Legenden und weiße Polsterung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy