pyplot - Cómo cambiar los back-end en matplotlib/Python
plot title font size matplotlib (5)
Estoy luchando con el siguiente problema. Necesito generar informes que consistan en una colección de gráficos. Todos estos gráficos, excepto uno, están hechos usando el backend predeterminado de Matplotlib (TkAgg). Hay que hacer una tabla usando el backend de El Cairo, la razón es que estoy trazando un gráfico de igrafas y eso solo se puede trazar utilizando Cairo.
El problema es que no puedo cambiar los backends sobre la marcha, por ejemplo, lo siguiente no funciona:
matplotlib.pyplot.switch_backend(''cairo.png'')
(Sé que la funcionalidad switch_backend es experimental)
y también probé matplotlib.use("cairo.png")
pero esto genera problemas de importación ya que la matplotlib.use("cairo.png")
debe aparecer antes de importar matplotlib.pyplot
. pero necesito dos backends diferentes a lo largo de la vida del script.
Entonces, mi pregunta es, ¿alguien tiene un fragmento de código que muestra cómo cambiar el backend en Matplotlib?
¡Muchas gracias!
ACTUALIZACIÓN: He escrito un fragmento que carga matplotlib, muestra el motor por defecto, descarga matplotlib, lo recarga y cambia el servidor:
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()
pero, ¿esta es realmente la manera de hacerlo?
ACTUALIZACIÓN 2: Ayer tuve un congelamiento de cerebro serio ... La solución más simple y obvia es usar el back-end de El Cairo para todos los gráficos y no cambiar el back-end en absoluto :)
ACTUALIZACIÓN 3: En realidad, sigue siendo un problema para que cualquiera que sepa cómo cambiar dinámicamente los componentes de matplotlib ... por favor publique su respuesta.
¿Por qué no utilizar la función incorporada de reload
( importlib.reload
en Python 3)?
import matplotlib
matplotlib.use(''agg'')
matplotlib = reload(matplotlib)
matplotlib.use(''cairo.png'')
Entonces no estoy completamente seguro de si esto es lo que estás buscando.
Puedes cambiar tu backend a través del archivo matplotlibrc que contiene ciertas configuraciones para tu matplotlib.
En tu script puedes poner:
matplotlib.rcParams[''backend''] = ''TkAgg''
o algo así para cambiar entre backends.
Hay una característica "experimental":
import matplotlib.pyplot as p
p.switch_backend(''newbackend'')
tomado de matplotlib doc .
Cambia el backend predeterminado a newbackend. Esta característica es experimental , y solo se espera que funcione cambiando a un backend de imagen. Por ejemplo, si tiene un montón de scripts PostScript que desea ejecutar desde una sesión de ipython interactivo, es posible que desee cambiar al backend de la PS antes de ejecutarlos para evitar tener una gran cantidad de ventanas emergentes de GUI. Si intenta cambiar de forma interactiva de un servidor de GUI a otro, explotará. Llamar a este comando cerrará todas las ventanas abiertas.
Seis años después y me encontré con un problema similar, al tratar de decidir qué backend
estaba disponible para usar.
Este fragmento de código funciona bien para mí:
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
Como puede deducir, intercambiar el backend
es tan simple como volver a importar matplotlib.pyplot
después de forzar el nuevo backend
matplotlib.use(''WXAgg'',warn=False, force=True)
from matplotlib import pyplot as plt
print "Switched to:",matplotlib.get_backend()
Switched to: WXAgg
Para aquellos que todavía tienen problemas, este código imprimirá el:
lista de backends Non Gui;
la lista de backends Gui;
y luego intente utilizar cada backend Gui para ver si está presente y funcionando.
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")
También podrías tener un proceso de Python diferente para hacer ese diagrama, posiblemente con la ayuda de pickle o joblib .