Liste aller verfügbaren Matplotlib-Backends

70

Auf den aktuellen Backend-Namen kann über zugegriffen werden

>>> importiere matplotlib.pyplot als plt
>>> plt.get_backend ()
"GTKAgg"

Gibt es eine Möglichkeit, eine Liste aller Backends zu erhalten, die auf einem bestimmten Computer verwendet werden können?

Alexander Gromnitsky
quelle

Antworten:

59

Sie können auf die Listen zugreifen

matplotlib.rcsetup.interactive_bk
matplotlib.rcsetup.non_interactive_bk
matplotlib.rcsetup.all_backends

Das dritte ist die Verkettung der beiden ersteren. Wenn ich den Quellcode richtig gelesen habe, sind diese Listen jedoch fest codiert und sagen Ihnen nicht, welche Backends tatsächlich verwendet werden können. Es gibt auch

matplotlib.rcsetup.validate_backend(name)

Dies prüft aber auch nur die fest codierte Liste.

Sven Marnach
quelle
47

Hier ist eine Modifikation des zuvor veröffentlichten Skripts. Es findet alle unterstützten Backends, validiert sie und misst ihre fps. Unter OSX stürzt Python ab, wenn es um tkAgg geht. Verwenden Sie es also auf eigenes Risiko;)

from __future__ import print_function, division, absolute_import
from pylab import *
import time

import matplotlib.backends
import matplotlib.pyplot as p
import os.path


def is_backend_module(fname):
    """Identifies if a filename is a matplotlib backend module"""
    return fname.startswith('backend_') and fname.endswith('.py')

def backend_fname_formatter(fname): 
    """Removes the extension of the given filename, then takes away the leading 'backend_'."""
    return os.path.splitext(fname)[0][8:]

# get the directory where the backends live
backends_dir = os.path.dirname(matplotlib.backends.__file__)

# filter all files in that directory to identify all files which provide a backend
backend_fnames = filter(is_backend_module, os.listdir(backends_dir))

backends = [backend_fname_formatter(fname) for fname in backend_fnames]

print("supported backends: \t" + str(backends))

# validate backends
backends_valid = []
for b in backends:
    try:
        p.switch_backend(b)
        backends_valid += [b]
    except:
        continue

print("valid backends: \t" + str(backends_valid))


# try backends performance
for b in backends_valid:

    ion()
    try:
        p.switch_backend(b)


        clf()
        tstart = time.time()               # for profiling
        x = arange(0,2*pi,0.01)            # x-array
        line, = plot(x,sin(x))
        for i in arange(1,200):
            line.set_ydata(sin(x+i/10.0))  # update the data
            draw()                         # redraw the canvas

        print(b + ' FPS: \t' , 200/(time.time()-tstart))
        ioff()

    except:
        print(b + " error :(")
stfn
quelle
Das Skript stürzt für mich ab ( gist.github.com/palmstrom/6039823 ), funktioniert aber gut, wenn es unter Spyder IDE ausgeführt wird.
Matěj Šmíd
Was sind typische Ergebnisse dieser Benchmark? FPS nummeriert jemand?
rc0r
2
so genial! Live-Zeichnung! berechnet die Framerate und druckt sie aus! Sehr nützlich, um herauszufinden, welches Backend auf Ihrem Computer am schnellsten ist.
Trevor Boyd Smith
1
python2Um das Skript unter auszuführen , machen Sie die erste Zeile nach shebang the from __future__ import print_function, division, absolute_import. (Ich wollte den Code in der Frage bearbeiten ... aber er python2ist zu diesem Zeitpunkt so verdammt alt ... Ich denke, es ist schlecht, diese Art von Cruft hinzuzufügen ... Ich denke, es würde nur schlechtes Verhalten fördern .)
Trevor Boyd Smith
6

Es gibt die von Sven erwähnte fest codierte Liste, aber um jedes Backend zu finden, das Matplotlib verwenden kann (basierend auf der aktuellen Implementierung zum Einrichten eines Backends), kann der Ordner matplotlib / backends überprüft werden.

Der folgende Code macht das:

import matplotlib.backends
import os.path

def is_backend_module(fname):
    """Identifies if a filename is a matplotlib backend module"""
    return fname.startswith('backend_') and fname.endswith('.py')

def backend_fname_formatter(fname): 
    """Removes the extension of the given filename, then takes away the leading 'backend_'."""
    return os.path.splitext(fname)[0][8:]

# get the directory where the backends live
backends_dir = os.path.dirname(matplotlib.backends.__file__)

# filter all files in that directory to identify all files which provide a backend
backend_fnames = filter(is_backend_module, os.listdir(backends_dir))

backends = [backend_fname_formatter(fname) for fname in backend_fnames]

print backends
Pelson
quelle
5

Sie können so tun, als würden Sie ein falsches Backend-Argument einfügen. Dann erhalten Sie einen ValueError mit der Liste der gültigen Matplotlib-Backends wie folgt:

Eingang:

import matplotlib
matplotlib.use('WRONG_ARG')

Ausgabe:

ValueError: Unrecognized backend string 'test': valid strings are ['GTK3Agg', 'GTK3Cairo', 'MacOSX', 'nbAgg', 'Qt4Agg', 'Qt4Cairo', 'Qt5Agg', 'Qt
5Cairo', 'TkAgg', 'TkCairo', 'WebAgg', 'WX', 'WXAgg', 'WXCairo', 'agg', 'cairo', 'pdf', 'pgf', 'ps', 'svg', 'template']
Sir iPad Newton
quelle
3

Hier finden Sie auch einige Dokumentationen zu einigen Backends:

http://matplotlib.org/api/index_backend_api.html

Auf den Seiten sind nur einige Backends aufgeführt, von denen einige nicht ordnungsgemäß dokumentiert sind:

matplotlib.backend_bases
matplotlib.backends.backend_gtkagg
matplotlib.backends.backend_qt4agg
matplotlib.backends.backend_wxagg
matplotlib.backends.backend_pdf
matplotlib.dviread
matplotlib.type1font
Leandro
quelle
Es tut mir leid, ich dachte, dass die obigen Antworten das Thema abdecken, sollte aber den Link als Referenz haben, deshalb habe ich gepostet. Ich meine keinen Schaden, ich bin ein Noob.
Leandro
2

Im folgenden Ordner finden Sie eine Liste möglicher Backends ...

/Library/Python/2.6/site-packages/matplotlib/backends
/usr/lib64/Python2.6/site-packages/matplotlib/backends
Bill Lynch
quelle
1

Was ist damit?

%matplotlib --list
Available matplotlib backends: ['tk', 'gtk', 'gtk3', 'wx', 'qt4', 'qt5', 'qt', 'osx', 'nbagg', 'notebook', 'agg', 'svg', 'pdf', 'ps', 'inline', 'ipympl', 'widget']
Gadi Oron
quelle