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.
quelle
pyplot.switch_backends()
. In Ihrem Fall funktioniert es möglicherweise nicht.Antworten:
Sechs Jahre später stieß ich auf ein ähnliches Problem, als ich versuchte zu entscheiden, welches
backend
zur 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
backend
so einfach wie das erneute Importierenmatplotlib.pyplot
nach 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")
quelle
Es gibt eine "experimentelle" Funktion:
import matplotlib.pyplot as plt plt.switch_backend('newbackend')
entnommen aus matplotlib doc .
quelle
Warum nicht einfach die
reload
eingebaute Funktion (importlib.reload
in Python 3) verwenden?import matplotlib matplotlib.use('agg') matplotlib = reload(matplotlib) matplotlib.use('cairo.png')
quelle
python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"
Ist das richtig?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.
quelle
~/.config/matplotlib/matplotlibrc
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....
quelle
Um das Backend dauerhaft zu ändern, können Sie Folgendes verwenden:
Suchen Sie zuerst die
matplotlibrc
Datei:import matplotlib matplotlib.matplotlib_fname() # '/Users/serafeim/.matplotlib/matplotlibrc'
Öffnen Sie das Terminal und gehen Sie wie folgt vor:
Bearbeiten Sie die Datei (falls sie nicht vorhanden ist, verwenden Sie diesen Befehl:
touch matplotlib
um sie zu erstellen):Fügen Sie diese Zeile hinzu und speichern Sie:
quelle
Sie können diesen Plot auch von einem anderen Python-Prozess erstellen lassen, möglicherweise mithilfe von pickle oder joblib .
quelle
Wenn Sie eine IPython-Konsole verwenden (auch in Spyder), können Sie integrierte magische Befehle verwenden, um schnell zwischen Backends zu wechseln, z.
Rufen Sie eine Liste der verfügbaren Backends ab, die mit dem Befehl verwendet werden können:
quelle