So ändern Sie Backends in matplotlib / Python

87

Ich habe Probleme mit dem folgenden Problem. Ich muss Berichte erstellen, die aus einer Sammlung von Diagrammen bestehen. Alle diese Diagramme mit einer Ausnahme werden mit dem Matplotlib-Standard-Backend (TkAgg) erstellt. Ein Diagramm muss mit dem Kairoer Backend erstellt werden. Der Grund dafür ist, dass ich ein Igraph-Diagramm zeichne, das nur mit Kairo gezeichnet werden kann.

Das Problem ist, dass ich Backends nicht
matplotlib.pyplot.switch_backend('cairo.png') im laufenden Betrieb ändern kann. Beispielsweise funktioniert Folgendes nicht: (Ich weiß, dass die switch_backend-Funktionalität experimentell ist)

und ich habe es auch versucht, matplotlib.use("cairo.png")aber dies führt zu Importproblemen, da die matplotlib.use("cairo.png")Anweisung vor dem Import kommen sollte matplotlib.pyplot. Aber ich brauche im Laufe des Skriptlebens zwei verschiedene Backends.

Meine Frage ist also, ob jemand ein Code-Snippet hat, das zeigt, wie man das Backend in Matplotlib wechselt.

Vielen Dank!

UPDATE: Ich habe ein Snippet geschrieben, das matplotlib lädt, das Standard-Backend anzeigt, matplotlib entlädt, neu lädt und das Backend ändert:

import matplotlib
import matplotlib.pyplot as plt
import sys
print matplotlib.pyplot.get_backend()

modules = []
for module in sys.modules:
    if module.startswith('matplotlib'):
        modules.append(module)

for module in modules:
    sys.modules.pop(module)

import matplotlib
matplotlib.use("cairo.png")
import matplotlib.pyplot as plt

print matplotlib.pyplot.get_backend()

Aber ist das wirklich der richtige Weg?

UPDATE 2: Ich hatte gestern ein ernstes Einfrieren des Gehirns ... Die einfachste und naheliegendste Lösung besteht darin, das Kairoer Backend für alle Charts zu verwenden und das Backend überhaupt nicht zu wechseln :)

UPDATE 3: Eigentlich ist es immer noch ein Problem, also jeder, der weiß, wie man Matplotlib-Backends dynamisch wechselt ... bitte posten Sie Ihre Antwort.

DrDee
quelle
Es gibt pyplot.switch_backends(). In Ihrem Fall funktioniert es möglicherweise nicht.
JFS

Antworten:

59

Sechs Jahre später stieß ich auf ein ähnliches Problem, als ich versuchte zu entscheiden, welches backendzur Verwendung verfügbar war.
Dieses Code-Snippet funktioniert gut für mich:

import matplotlib
gui_env = ['TKAgg','GTKAgg','Qt4Agg','WXAgg']
for gui in gui_env:
    try:
        print "testing", gui
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        break
    except:
        continue
print "Using:",matplotlib.get_backend()

Using: GTKAgg

Wie Sie ableiten können, ist das Austauschen von backendso einfach wie das erneute Importieren matplotlib.pyplotnach dem Erzwingen des neuenbackend

matplotlib.use('WXAgg',warn=False, force=True)
from matplotlib import pyplot as plt
print "Switched to:",matplotlib.get_backend()

Switched to: WXAgg

Für diejenigen, die immer noch Probleme haben, druckt dieser Code die:
Liste der Nicht-Gui-Backends;
die Liste der Gui-Backends;
und versuchen Sie dann, jedes Gui-Backend zu verwenden, um festzustellen, ob es vorhanden ist und funktioniert.

import matplotlib
gui_env = [i for i in matplotlib.rcsetup.interactive_bk]
non_gui_backends = matplotlib.rcsetup.non_interactive_bk
print ("Non Gui backends are:", non_gui_backends)
print ("Gui backends I will test for", gui_env)
for gui in gui_env:
    print ("testing", gui)
    try:
        matplotlib.use(gui,warn=False, force=True)
        from matplotlib import pyplot as plt
        print ("    ",gui, "Is Available")
        plt.plot([1.5,2.0,2.5])
        fig = plt.gcf()
        fig.suptitle(gui)
        plt.show()
        print ("Using ..... ",matplotlib.get_backend())
    except:
        print ("    ",gui, "Not found")
Rolf von Sachsen
quelle
Vielen Dank! Dies hat mir sehr geholfen, das passende Back-End für dieses Beispiel zu finden: stackoverflow.com/questions/11874767/…
James Nelson
Rolf von Sachsen, LOL sehr hilfreich, ich bekomme immer noch Antworten auf Ubuntu und Android Post von vor fast einem Jahrzehnt.
James Nelson
37

Es gibt eine "experimentelle" Funktion:

import matplotlib.pyplot as plt
plt.switch_backend('newbackend')

entnommen aus matplotlib doc .

Schalten Sie das Standard-Backend auf Newbackend um. Diese Funktion ist experimentell und wird voraussichtlich nur beim Umschalten auf ein Bild-Backend funktionieren. Wenn Sie beispielsweise eine Reihe von PostScript-Skripten haben, die Sie in einer interaktiven Ipython-Sitzung ausführen möchten, möchten Sie möglicherweise vor dem Ausführen zum PS-Backend wechseln, um zu vermeiden, dass eine Reihe von GUI-Fenstern angezeigt wird. Wenn Sie versuchen, interaktiv von einem GUI-Backend zu einem anderen zu wechseln, explodieren Sie. Durch Aufrufen dieses Befehls werden alle geöffneten Fenster geschlossen.

oyo
quelle
Nicht erkannte Backend-Zeichenfolge "newbackend". Was soll ich machen?
TSR
3
@TSR Ersetzen Sie 'newbackend' durch ein GUI-Backend wie 'Qt4Agg'
YashTD
14

Warum nicht einfach die reloadeingebaute Funktion ( importlib.reloadin Python 3) verwenden?

import matplotlib
matplotlib.use('agg')

matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
Fredbaba
quelle
Wie in können Sie matplotlib und matplotlib.pyplot nicht neu laden? Oder sagen Sie nur, dass mein abgeschnittener Code unvollständig ist?
Fredbaba
Hmm. Könnte tatsächlich eine Eigenart von IPython gewesen sein. Scheint in der normalen Konsole gut zu funktionieren.
Mad Physicist
1
Ich denke, dies ist ein Beispiel, das zeigt, dass es nicht funktioniert: python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"Ist das richtig?
Lukas
6

Ich bin mir also nicht ganz sicher, ob Sie danach suchen.

Sie können Ihr Backend über die matplotlibrc-Datei ändern, die bestimmte Konfigurationen für Ihre matplotlib enthält.

In Ihr Skript können Sie Folgendes einfügen:

matplotlib.rcParams['backend'] = 'TkAgg' 

oder so ähnlich, um zwischen Backends zu wechseln.

Hilfsfunktion
quelle
2
Sie können das Backend zwar in Ihrem rcParams-Wörterbuch angeben, dies löst jedoch nicht das Problem des Wechsels von einem Backend zu einem anderen.
DrDee
Sie können auch das Standard-Backend in der Konfigurationsdatei festlegen, die von matplotlib abgerufen wird:~/.config/matplotlib/matplotlibrc
prüft
4

In meinem Fall (Windows 10 + Python 3.7) hat die erste Antwort von @Rolf aus Sachsen nicht sehr gut funktioniert. Anstatt alle verfügbaren Umgebungen auszuprobieren und zu Beginn eine davon zu konfigurieren, dh kurz danach

    import matplotlib

Ich musste die Umgebung mit 'Agg' auf 'TkAgg' ändern

    matplotlib.use('TKAgg',warn=False, force=True)

direkt vor dem Code, in dem ich tatsächlich gezeichnet habe, dh

    import matplotlib.pyplot as plt
    fig = plt.figure()
    # AND SO ON....
Pe Dro
quelle
2

Um das Backend dauerhaft zu ändern, können Sie Folgendes verwenden:

  1. Suchen Sie zuerst die matplotlibrcDatei:

    import matplotlib
    
    matplotlib.matplotlib_fname()
    # '/Users/serafeim/.matplotlib/matplotlibrc'
    
  2. Öffnen Sie das Terminal und gehen Sie wie folgt vor:

    cd /Users/serafeim/.matplotlib/
    ls
    
  3. Bearbeiten Sie die Datei (falls sie nicht vorhanden ist, verwenden Sie diesen Befehl: touch matplotlibum sie zu erstellen):

    vim matplotlibrc
    
  4. Fügen Sie diese Zeile hinzu und speichern Sie:

    backend: TkAgg
    
Seralouk
quelle
1

Sie können diesen Plot auch von einem anderen Python-Prozess erstellen lassen, möglicherweise mithilfe von pickle oder joblib .

Ken Arnold
quelle
0

Wenn Sie eine IPython-Konsole verwenden (auch in Spyder), können Sie integrierte magische Befehle verwenden, um schnell zwischen Backends zu wechseln, z.

%matplotlib qt

Rufen Sie eine Liste der verfügbaren Backends ab, die mit dem Befehl verwendet werden können:

%matplotlib --list

Verfügbare Matplotlib-Backends: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', ' svg ',' pdf ',' ps ',' inline ',' ipympl ',' widget ']

Mike T.
quelle