2010-07-19 15 views
45

Tengo problemas 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.Cómo cambiar los procesadores en matplotlib/Python

El problema es que no puedo cambiar backends sobre la marcha, por ejemplo, el siguiente no funciona: También
matplotlib.pyplot.switch_backend('cairo.png') (sé que la funcionalidad switch_backend es experimental)

y he intentado matplotlib.use("cairo.png") pero esto lleva a problemas de importación ya que la declaración matplotlib.use("cairo.png") debe aparecer antes de importar matplotlib.pyplot. pero necesito dos backends diferentes a lo largo de la vida del script.

Así que 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 las cargas matplotlib, muestra el backend por defecto, descarga matplotlib, vuelve a cargar y cambia el 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() 

pero esta es realmente la manera de hacerlo?

ACTUALIZACIÓN 2: Yo tenía un poco de congelación cerebral grave ayer ... La solución más simple y más obvia es utilizar el backend Cairo para todos los gráficos y no para cambiar el backend en absoluto :)

Actualización 3: En realidad , sigue siendo un problema por lo que cualquiera que sepa cómo cambiar dinámicamente los backends de matplotlib ... por favor publique su respuesta.

+0

Hay 'pyplot.switch_backends()'. Puede que no funcione en tu caso. – jfs

Respuesta

0

Así que no estoy del todo seguro de si esto es lo que estás buscando.

Puede cambiar su back-end a través del archivo matplotlibrc que contiene ciertas configuraciones para su matplotlib.

En la secuencia de comandos se puede poner:

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

o algo por el estilo para cambiar entre los backends.

+2

De hecho, puede especificar el backend en su diccionario rcParams pero eso no resuelve el problema de cambiar de un servidor a otro. – DrDee

1

También podría tener un proceso de Python diferente para hacer ese trazado, posiblemente con la ayuda de pickle o joblib.

32

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 grupo de scripts PostScript que desea ejecutar desde una sesión de ipython interactivo, puede desear para cambiar al backend de PS antes de ejecutarlos para evitar que aparezca un gran número de ventanas de ventanas de la GUI en . Si intentas cambiar interactivamente de un backend GUI a otro, explotarás. Al ejecutar este comando, se cerrarán todas las ventanas abiertas.

+0

Cadena de backend no reconocida "newbackend". ¿Que debería hacer? – TSR

+1

@TSR Reemplazar 'newbackend' con un backend GUI como 'Qt4Agg' – YashTD

10

¿Por qué no simplemente utiliza la función incorporada reload (importlib.reload en Python 3)?

import matplotlib 
matplotlib.use('agg') 

matplotlib = reload(matplotlib) 
matplotlib.use('cairo.png') 
+0

Esto no funciona si ha importado pyplot. –

+0

¿Como en usted no puede volver a cargar matplotlib y matplotlib.pyplot? ¿O solo estás diciendo que mi código cortado es incompleto? – fredbaba

+0

Hmm. Podría haber sido realmente una peculiaridad de IPython. Parece funcionar bien en la consola normal. –

15

Seis años más tarde y me encontré con un problema similar, cuando se trata de decidir qué backend estaba disponible para su uso.
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 se puede deducir, intercambiando el backend es tan simple como volver a importar matplotlib.pyplot después de obligar a la nueva 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 tiene problemas , este código imprimirá la:
lista de backends Non Gui;
la lista de backends Gui;
y luego intente utilizar cada back-end 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") 
+0

Gracias! Esto funcionó muy bien ayudándome a encontrar el back-end apropiado para este ejemplo: http://stackoverflow.com/questions/11874767/real-time-plotting-in-while-loop-with-matplotlib –

+0

@JamesNelson Me alegra oír que respuesta que fue 6 años tarde, era de uso –

+0

Rolf of Saxony, LOL muy útil, todavía recibo respuestas en publicaciones de Ubuntu y Android de hace casi una década. –

Cuestiones relacionadas