Leistung #
Unabhängig davon, ob Sie Daten im interaktiven Modus untersuchen oder viele Diagramme programmgesteuert speichern, kann die Rendering-Leistung ein herausfordernder Engpass in Ihrer Pipeline sein. Matplotlib bietet mehrere Möglichkeiten, die Renderzeit auf Kosten einer geringfügigen Änderung (auf eine einstellbare Toleranz) im Erscheinungsbild Ihres Diagramms erheblich zu reduzieren. Die verfügbaren Methoden zum Reduzieren der Renderzeit hängen von der Art des zu erstellenden Diagramms ab.
Liniensegmentvereinfachung #
Für Diagramme mit Liniensegmenten (z. B. typische Liniendiagramme, Umrisse von Polygonen usw.) kann die Darstellungsleistung durch
rcParams["path.simplify"]
(Standard: True
) und rcParams["path.simplify_threshold"]
(Standard: 0.111111111111
) gesteuert werden, die z. B. in der matplotlibrc
Datei definiert werden können (siehe
Anpassen von Matplotlib mit style Sheets und rcParams für weitere Informationen über die matplotlibrc
Datei). rcParams["path.simplify"]
(Standard: True
) ist ein boolescher Wert, der angibt, ob Liniensegmente überhaupt vereinfacht werden oder nicht.
rcParams["path.simplify_threshold"]
(Standard: 0.111111111111
) steuert, wie stark Liniensegmente vereinfacht werden; Höhere Schwellenwerte führen zu einem schnelleren Rendern.
Das folgende Skript zeigt die Daten zunächst ohne Vereinfachung und dann mit Vereinfachung an. Versuchen Sie, mit beiden zu interagieren:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()
mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()
Matplotlib verwendet derzeit standardmäßig eine konservative Vereinfachungsschwelle von 1/9
. Um die Standardeinstellungen zu ändern, um einen anderen Wert zu verwenden, ändern Sie die matplotlibrc
Datei. Alternativ können Benutzer einen neuen Stil für das interaktive Plotten (mit maximaler Vereinfachung) und einen anderen Stil für das Plotten in Publikationsqualität (mit minimaler Vereinfachung) erstellen und bei Bedarf aktivieren. Anweisungen zum Ausführen dieser Aktionen finden Sie unter Anpassen von Matplotlib mit Stylesheets und rcParams .
Die Vereinfachung funktioniert durch iteratives Zusammenführen von Liniensegmenten zu einem einzelnen Vektor, bis der senkrechte Abstand des nächsten Liniensegments zum Vektor (gemessen im Anzeigekoordinatenraum) größer als der path.simplify_threshold
Parameter ist.
Notiz
Änderungen bezüglich der Vereinfachung von Liniensegmenten wurden in Version 2.1 vorgenommen. Die Renderzeit wird durch diese Parameter vor Version 2.1 immer noch verbessert, aber die Renderzeit für einige Arten von Daten wird in den Versionen 2.1 und höher erheblich verbessert.
Markierungsunterabtastung #
Markierungen können auch vereinfacht werden, wenn auch weniger robust als Liniensegmente. Marker-Subsampling ist nur für Line2D
Objekte verfügbar (über die markevery
Eigenschaft). Überall dort, wo Line2D
Konstruktionsparameter übergeben werden, wie z. B. pyplot.plot
und Axes.plot
, kann der markevery
Parameter verwendet werden:
plt.plot(x, y, markevery=10)
Das markevery
Argument ermöglicht eine naive Unterabtastung oder einen Versuch einer gleichmäßig beabstandeten (entlang der x - Achse) Abtastung. Weitere Informationen finden Sie in der
Markevery-Demo
.
Linien in kleinere Stücke aufteilen #
Wenn Sie das Agg-Backend verwenden (siehe Was ist ein Backend? ), können Sie rcParams["agg.path.chunksize"]
(Standard: 0
) verwenden. Dadurch können Benutzer eine Blockgröße angeben, und alle Zeilen mit mehr als dieser Anzahl von Scheitelpunkten werden in mehrere Zeilen aufgeteilt , von denen jede nicht mehr als agg.path.chunksize
viele Ecken hat. (Es sei denn agg.path.chunksize
, es ist Null, in diesem Fall gibt es kein Chunking.) Bei einigen Datentypen kann das Chunking der Zeile in angemessene Größen die Renderzeit erheblich verkürzen.
Das folgende Skript zeigt die Daten zunächst ohne Chunk-Größenbeschränkung und dann dieselben Daten mit einer Chunk-Größe von 10.000 an. Der Unterschied ist am besten zu sehen, wenn die Figuren groß sind, versuchen Sie, die GUI zu maximieren und dann mit ihnen zu interagieren:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 1.0
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['agg.path.chunksize'] = 0
plt.plot(y)
plt.show()
mpl.rcParams['agg.path.chunksize'] = 10000
plt.plot(y)
plt.show()
Legenden #
Das standardmäßige Legendenverhalten für Achsen versucht, die Position zu finden, die die wenigsten Datenpunkte abdeckt ( loc='best'
). Dies kann eine sehr teure Berechnung sein, wenn viele Datenpunkte vorhanden sind. In diesem Fall möchten Sie möglicherweise einen bestimmten Standort angeben.
Verwenden des schnellen Stils #
Der schnelle Stil kann verwendet werden, um die Vereinfachungs- und Chunking-Parameter automatisch auf angemessene Einstellungen einzustellen, um das Plotten großer Datenmengen zu beschleunigen. Der folgende Code führt es aus:
import matplotlib.style as mplstyle
mplstyle.use('fast')
Es ist sehr leicht und passt daher gut zu anderen Stilen. Stellen Sie sicher, dass der schnelle Stil zuletzt angewendet wird, damit andere Stile die Einstellungen nicht überschreiben:
mplstyle.use(['dark_background', 'ggplot', 'fast'])