Come passare backend in matplotlib / Python

Io sono alle prese con il seguente problema. Ho bisogno di generare report che consiste in una raccolta di grafici. Tutti questi grafici, tranne uno, sono realizzati con Matplotlib backend di default (TkAgg). Un grafico deve essere effettuata utilizzando il Cairo backend, il motivo è che sto tracciando una igraph grafico e che può essere tracciata utilizzando il Cairo.

Il problema è che non posso cambiare backend al volo, per esempio, la seguente non funziona:

matplotlib.pyplot.switch_backend('cairo.png')
(So che il switch_backend funzionalità è in fase sperimentale)

e ho anche provato matplotlib.use("cairo.png") ma questo porta a problemi di importazione come il matplotlib.use("cairo.png") istruzione dovrebbe venire prima di importare matplotlib.pyplot.
ma ho bisogno di due diversi backend nel corso della vita dello script.

Quindi la mia domanda è, qualcuno ha un frammento di codice che mostra come passare il backend in Matplotlib?

Grazie mille!

AGGIORNAMENTO:
Ho scritto un frammento che carichi matplotlib, mostra il backend di default, scarica matplotlib, ricarica e cambia il 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()

ma è davvero questo il modo per farlo?

AGGIORNA 2: ho avuto alcune gravi congelare il cervello di ieri… semplice e più ovvia soluzione è usare il Cairo backend per tutti i grafici e non per passare il backend a tutti 🙂

AGGIORNA 3: in Realtà, è ancora un problema quindi se qualcuno sa come cambiare dinamicamente matplotlib backend….si prega di inviare la vostra risposta.

  • C’è pyplot.switch_backends(). Potrebbe non funzionare nel tuo caso.
InformationsquelleAutor DrDee | 2010-07-19



7 Replies
  1. 44

    Sei anni dopo, e mi sono imbattuto in un problema simile, quando si cerca di decidere che backend è disponibile per l’uso.

    Questo frammento di codice funziona bene per me:

    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

    Come si può dedurre, scambiando il backend è semplice come re-importazione di matplotlib.pyplot dopo costringendo il nuovo backend

    matplotlib.use('WXAgg',warn=False, force=True)
    from matplotlib import pyplot as plt
    print "Switched to:",matplotlib.get_backend()
    
    Switched to: WXAgg

    Per coloro che continuano ad avere problemi, questo codice stamperà il:

    elenco dei paesi Gui backend;

    elenco di Gui backend;

    e quindi si tenta di utilizzare ogni Gui backend per vedere se è presente e funzionante.

    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")
    • Grazie! Questo ha lavorato molto aiutato a trovare il back-end appropriato per questo esempio: stackoverflow.com/questions/11874767/…
    • Rolf di Sassonia, LOL molto utile, ho ancora ottenere risposte su Ubuntu e Android post di quasi un decennio fa.
  2. 34

    C’è un “sperimentale” caratteristica :

    import matplotlib.pyplot as plt
    plt.switch_backend('newbackend')

    preso da matplotlib doc.

    Passare il backend di default per newbackend. Questa funzione è
    sperimentale, ed è previsto solo per lavori il passaggio a un
    immagine di backend. Ad esempio, se si dispone di un gruppo di PostScript script
    si desidera eseguire dal interattiva ipython sessione, è possibile che desideri
    per passare al PS backend prima di eseguire loro per evitare di avere un
    mazzo di GUI contestuale di windows. Se si tenta di interruttore in modo interattivo
    da una GUI backend per un altro, esploderà.
    Chiamando questo comando per chiudere tutte le finestre aperte.

    • Non riconosciuto backend stringa “newbackend”. Cosa devo fare?
    • Sostituire ‘newbackend’ con un’interfaccia di backend come ‘Qt4Agg’
  3. 13

    Perché non usare il ricarica funzione built-in (importlib.ricarica in Python 3)?

    import matplotlib
    matplotlib.use('agg')
    
    matplotlib = reload(matplotlib)
    matplotlib.use('cairo.png')
    • Questo non funziona se si hanno importato pyplot.
    • Come non si può ricaricare matplotlib e matplotlib.pyplot? O stai solo dicendo che il mio codice snipped è incompleta?
    • Hmm. Potrebbe effettivamente un capriccio di IPython. Sembra funzionare bene, nel regolare console.
    • Penso che questo è un esempio che dimostra che non funziona: python -c "import matplotlib.pyplot as plt; import matplotlib; from importlib import reload; matplotlib = reload(matplotlib); matplotlib.use('Agg')" giusto?
  4. 3

    Quindi non sono del tutto sicuro se questo è quello che stai cercando.

    È possibile modificare il vostro backend attraverso il matplotlibrc file che contiene alcune configurazioni per il tuo matplotlib.

    Nel tuo script si può mettere:

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

    o qualcosa di simile per passare backend.

    • Infatti, è possibile specificare il backend nel rcParams dizionario, ma che non risolve il problema di passare da un backend per un altro.
    • si può anche impostare il backend di default nel file di configurazione che viene captato dalle matplotlib: ~/.config/matplotlib/matplotlibrc
  5. 1

    Nel mio caso (Windows 10 + python 3.7), la prima risposta da @Rolf della Sassonia non ha funzionato molto bene. Invece di cercare tutti gli ambienti e la configurazione di uno di loro all’inizio,
    io.e, solo dopo

        import matplotlib

    Ho dovuto cambiare l’ambiente da ‘Agg’ a ‘TkAgg’ utilizzo di

        matplotlib.use('TKAgg',warn=False, force=True)

    a destra prima del codice in cui ho effettivamente trovato, io.e,

        import matplotlib.pyplot as plt
        fig = plt.figure()
        # AND SO ON....
  6. 1

    Per modificare in modo permanente il backend è possibile utilizzare questo:

    1. Prima individuare il matplotlibrc file:

      import matplotlib
      
      matplotlib.matplotlib_fname()
      # '/Users/serafeim/.matplotlib/matplotlibrc'
    2. Aprire il terminale e fare:

      cd /Users/serafeim/.matplotlib/
      ls
    3. Modificare il file (se non esiste usare questo comando: touch matplotlib per crearlo):

      vim matplotlibrc
    4. Aggiungere questa riga e salvare:

      backend: TkAgg

Lascia un commento