Je me bats 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 en utilisant le backend par défaut de Matplotlib (TkAgg). Un graphique doit être créé en utilisant le backend du Caire, la raison en est que je trace un graphique igraph et qui ne peut être tracé qu'en utilisant le Caire.
Le problème est que je ne peux pas modifier 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 l'instruction matplotlib.use("cairo.png")
doit venir avant d'importer matplotlib.pyplot
. mais j'ai besoin de deux backends différents au cours de la vie du script.
Ma question est donc: quelqu'un a-t-il un extrait de code qui montre comment changer le backend dans Matplotlib?
Merci beaucoup!
MISE À JOUR: J'ai écrit un extrait 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 la plus simple et la plus évidente consiste à utiliser le backend du Caire pour tous les graphiques et à ne pas changer de backend du tout :)
MISE À JOUR 3: En fait, c'est toujours un problème, donc toute personne qui sait comment changer dynamiquement les backends de matplotlib .... veuillez poster votre réponse.
Six ans plus tard, je suis tombé sur un problème similaire en essayant de décider quel 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, l'échange de backend
est aussi simple que de réimporter matplotlib.pyplot
après avoir forcé le nouveau backend
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:
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")
Il existe une fonctionnalité "expérimentale":
import matplotlib.pyplot as plt
plt.switch_backend('newbackend')
extrait de matplotlib doc .
Basculez le backend par défaut sur newbackend. Cette fonctionnalité est expérimentale et ne devrait fonctionner que pour passer à un backend d'image. Par exemple, si vous avez un tas de scripts PostScript que vous souhaitez exécuter à partir d'une session ipython interactive, vous pouvez passer au backend PS avant de les exécuter pour éviter d'avoir un tas de fenêtres popup GUI. Si vous essayez de passer de manière interactive d'un backend GUI à un autre, vous exploserez. L'appel de cette commande fermera toutes les fenêtres ouvertes.
Pourquoi ne pas simplement utiliser la fonction intégrée reload
( importlib.reload
in Python 3)?
import matplotlib
matplotlib.use('agg')
matplotlib = reload(matplotlib)
matplotlib.use('cairo.png')
Je ne suis donc pas tout à fait sûr de savoir si c'est 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.
Vous pouvez également avoir un processus Python différent pour faire ce tracé, éventuellement à l'aide de pickle ou joblib .
Pour changer définitivement le backend, vous pouvez utiliser ceci:
Recherchez d'abord le fichier matplotlibrc
:
import matplotlib
matplotlib.matplotlib_fname()
# '/Users/serafeim/.matplotlib/matplotlibrc'
Ouvrez le terminal et faites:
cd /Users/serafeim/.matplotlib/
ls
Modifiez le fichier (s'il n'existe pas, utilisez cette commande: touch matplotlib
pour le créer):
vim matplotlibrc
Ajoutez cette ligne et économisez:
backend: TkAgg
Dans mon cas (Windows 10 + python 3.7), la première réponse de @Rolf de Saxe n'a pas très bien fonctionné. Au lieu d'essayer tous les environnements disponibles et d'en configurer un 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 effectivement tracé, c'est-à-dire,
import matplotlib.pyplot as plt
fig = plt.figure()
# AND SO ON....