Je suis aux prises avec le problème suivant. J'ai besoin de générer des rapports qui consistent en une collection de graphiques. Tous ces graphiques, sauf un, sont créés à l'aide du backend par défaut de Matplotlib (TkAgg). Un graphique doit être créé en utilisant le backend Cairo, la raison en est que je trace un graphique igraph et qui ne peut être tracé qu'en utilisant Cairo.
Le problème est que je ne peux pas changer les backends à la volée, par exemple ce qui suit ne fonctionne pas:
matplotlib.pyplot.switch_backend('cairo.png')
(je sais que la fonctionnalité switch_backend est expérimentale)
et j'ai également essayé, matplotlib.use("cairo.png")
mais cela conduit à des problèmes d'importation car la matplotlib.use("cairo.png")
déclaration doit venir avant l'importation matplotlib.pyplot
. mais j'ai besoin de deux backends différents au cours de la vie du script.
Ma question est donc est-ce que quelqu'un a un extrait de code qui montre comment changer le backend dans Matplotlib?
Merci beaucoup!
MISE À JOUR: J'ai écrit un extrait de code qui charge matplotlib, montre le backend par défaut, décharge matplotlib, le recharge et change le backend:
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()
mais est-ce vraiment la façon de procéder?
MISE À JOUR 2: J'ai eu un sérieux gel du cerveau hier ... La solution simple et la plus évidente est d'utiliser le backend Cairo pour tous les graphiques et de ne pas changer de backend du tout :)
MISE À JOUR 3: En fait, c'est toujours un problème donc quiconque sait comment changer dynamiquement les backends matplotlib .... s'il vous plaît poster votre réponse.
la source
pyplot.switch_backends()
. Cela pourrait ne pas fonctionner dans votre cas.Réponses:
Six ans plus tard, je suis tombé sur un problème similaire, en essayant de décider lequel
backend
était disponible.Cet extrait de code fonctionne bien pour moi:
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
Comme vous pouvez le déduire, permuter le
backend
est aussi simple que de réimportermatplotlib.pyplot
après avoir forcé le nouveaubackend
matplotlib.use('WXAgg',warn=False, force=True) from matplotlib import pyplot as plt print "Switched to:",matplotlib.get_backend() Switched to: WXAgg
Pour ceux qui ont encore des problèmes, ce code imprimera: la
liste des backends Non Gui;
la liste des backends Gui;
puis essayez d'utiliser chaque backend Gui pour voir s'il est présent et fonctionne.
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")
la source
Il existe une fonctionnalité "expérimentale":
import matplotlib.pyplot as plt plt.switch_backend('newbackend')
extrait de matplotlib doc .
la source
Pourquoi ne pas simplement utiliser la
reload
fonction intégrée (importlib.reload
en Python 3)?import matplotlib matplotlib.use('agg') matplotlib = reload(matplotlib) matplotlib.use('cairo.png')
la source
python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')"
est-ce exact?Je ne suis donc pas tout à fait sûr que ce soit ce que vous recherchez.
Vous pouvez changer votre backend via le fichier matplotlibrc qui contient certaines configurations pour votre matplotlib.
Dans votre script, vous pouvez mettre:
matplotlib.rcParams['backend'] = 'TkAgg'
ou quelque chose comme ça pour basculer entre les backends.
la source
~/.config/matplotlib/matplotlibrc
Dans mon cas (Windows 10 + python 3.7), la première réponse de @Rolf of Saxony n'a pas très bien fonctionné. Au lieu d'essayer tous les environnements disponibles et de configurer l'un d'entre eux au début, c'est-à-dire juste après
import matplotlib
J'ai dû changer l'environnement de 'Agg' à 'TkAgg' en utilisant
matplotlib.use('TKAgg',warn=False, force=True)
juste avant le code où j'ai réellement tracé, c'est-à-dire
import matplotlib.pyplot as plt fig = plt.figure() # AND SO ON....
la source
Pour modifier définitivement le backend, vous pouvez utiliser ceci:
Localisez d'abord le
matplotlibrc
fichier:import matplotlib matplotlib.matplotlib_fname() # '/Users/serafeim/.matplotlib/matplotlibrc'
Ouvrez le terminal et faites:
Editez le fichier (s'il n'existe pas utilisez cette commande:
touch matplotlib
pour le créer):Ajoutez cette ligne et enregistrez:
la source
Vous pouvez également demander à un autre processus Python de créer ce tracé, éventuellement à l'aide de pickle ou de joblib .
la source
Si vous utilisez une console IPython (y compris dans Spyder), vous pouvez utiliser des commandes magiques intégrées pour changer rapidement de backends, par exemple:
Obtenez une liste des backends disponibles à utiliser avec la commande:
la source