Was gibt's Neues in Matplotlib 3.8.0 (13. Sept. 2023)#
Eine Liste aller Probleme und Pull-Anfragen seit der letzten Überarbeitung finden Sie in den GitHub-Statistiken für 3.10.3 (08. Mai 2025).
Type Hints#
Matplotlib stellt nun erstklassige PEP484-konforme Typ-Hinweisdateien für die meisten öffentlichen APIs bereit.
Obwohl sie immer noch als vorläufig gelten und Änderungen unterliegen können (und manchmal können wir nicht ganz spezifizieren, was wir möchten), sollten sie eine vernünftige Grundlage für die Typenprüfung vieler gängiger Nutzungsmuster sowie die Integration mit vielen Editoren/IDEs bieten.
Verbesserungen beim Plotten und Annotieren#
Unterstützung für die Anpassung von Antialiasing für Text und Annotation#
matplotlib.pyplot.annotate() und matplotlib.pyplot.text() unterstützen nun den Parameter antialiased. Wenn antialiased auf True gesetzt ist, wird Antialiasing auf den Text angewendet. Wenn antialiased auf False gesetzt ist, wird kein Antialiasing auf den Text angewendet. Wenn antialiased nicht angegeben ist, wird das Antialiasing durch rcParams["text.antialiased"] (Standard: True) zur Erstellungszeit des Text- und Annotation-Objekts festgelegt. Beispiele
mpl.text.Text(.5, .5, "foo\nbar", antialiased=True)
plt.text(0.5, 0.5, '6 inches x 2 inches', antialiased=True)
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5), antialiased=False)
Wenn der Text einen mathematischen Ausdruck enthält, gilt antialiased für den gesamten Text. Beispiele
# no part will be antialiased for the text below
plt.text(0.5, 0.25, r"$I'm \sqrt{x}$", antialiased=False)
Beachten Sie auch, dass das Antialiasing für Tick-Labels mit rcParams["text.antialiased"] (Standard: True) bei ihrer Erstellung (normalerweise, wenn eine Figure erstellt wird) gesetzt wird und danach nicht mehr geändert werden kann.
Darüber hinaus sollten Sie bei dieser neuen Funktion sicherstellen, dass Sie die Abbildung im selben Kontext erstellen und speichern/anzeigen.
# previously this was a no-op, now it is what works
with rccontext(text.antialiased=False):
fig, ax = plt.subplots()
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
fig.savefig('/tmp/test.png')
# previously this had an effect, now this is a no-op
fig, ax = plt.subplots()
ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5))
with rccontext(text.antialiased=False):
fig.savefig('/tmp/test.png')
rcParams für AutoMinorLocator Teilungen#
Die rcParams rcParams["xtick.minor.ndivs"] (Standard: 'auto') und rcParams["ytick.minor.ndivs"] (Standard: 'auto') wurden hinzugefügt, um die Festlegung der Standardanzahl von Teilungen zu ermöglichen; wenn auf auto gesetzt, wird die Anzahl der Teilungen durch den Abstand zwischen den Haupt-Ticks bestimmt.
Axline-Setter und Getter#
Das von axes.Axes.axline zurückgegebene Objekt unterstützt nun Getter- und Setter-Methoden für seine Attribute xy1, xy2 und slope.
line1.get_xy1()
line1.get_slope()
line2.get_xy2()
line1.set_xy1(.2, .3)
line1.set_slope(2.4)
line2.set_xy2(.1, .6)
Clipping für Konturdiagramme#
contour und contourf akzeptieren nun den Parameter clip_path.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
x = y = np.arange(-3.0, 3.01, 0.025)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2
fig, ax = plt.subplots()
patch = mpatches.RegularPolygon((0, 0), 5, radius=2,
transform=ax.transData)
ax.contourf(X, Y, Z, clip_path=patch)
plt.show()
Axes.ecdf#
Eine neue Axes-Methode, ecdf, ermöglicht das Plotten von empirischen kumulativen Verteilungsfunktionen ohne Binning.
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.ecdf(np.random.randn(100))
Figure.get_suptitle(), Figure.get_supxlabel(), Figure.get_supylabel()#
Diese Methoden geben die von Figure.suptitle(), Figure.supxlabel() bzw. Figure.supylabel() gesetzten Strings zurück.
Ellipse.get_vertices(), Ellipse.get_co_vertices()#
Diese Methoden geben die Koordinaten der Ellipsen-Scheitelpunkte der Haupt- und Nebenachse zurück. Zusätzlich wird ein Beispiel-Galerie-Demo hinzugefügt, das zeigt, wie man einem Ellipsenpfeil hinzufügt, der eine Uhrzeigersinn- oder Gegenuhrzeigersinn-Rotation der Ellipse anzeigt. Um den Pfeil genau auf der Ellipse zu platzieren, werden die Koordinaten der Scheitelpunkte verwendet.
Entfernen innerer Ticks in label_outer()#
Bisher hat label_outer() nur die Tick-Labels entfernt. Die Tick-Linien blieben sichtbar. Dies ist nun über einen neuen Parameter label_outer(remove_inner_ticks=True) konfigurierbar.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True,
gridspec_kw=dict(hspace=0, wspace=0))
axs[0, 0].plot(x, np.sin(x))
axs[0, 1].plot(x, np.cos(x))
axs[1, 0].plot(x, -np.cos(x))
axs[1, 1].plot(x, -np.sin(x))
for ax in axs.flat:
ax.grid(color='0.9')
ax.label_outer(remove_inner_ticks=True)
Konfigurierbare Legenden-Schatten#
Der shadow-Parameter von Legenden akzeptiert nun zusätzlich zu Booleans auch Dictionaries. Dictionaries können beliebige Schlüsselwörter für patches.Patch enthalten. Dies ermöglicht es beispielsweise, die Farbe und/oder Transparenz eines Legenden-Schattens einzustellen.
ax.legend(loc='center left', shadow={'color': 'red', 'alpha': 0.5})
und die Schattenposition zu steuern.
ax.legend(loc='center left', shadow={"ox":20, "oy":-20})
Die Konfiguration wird derzeit nicht über rcParams["legend.shadow"] (Standard: False) unterstützt.
offset Parameter für MultipleLocator#
Ein offset kann nun angegeben werden, um alle Ticks um den gegebenen Wert zu verschieben.
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
_, ax = plt.subplots()
ax.plot(range(10))
locator = mticker.MultipleLocator(base=3, offset=0.3)
ax.xaxis.set_major_locator(locator)
plt.show()
Neues gültiges Farbformat (matplotlib_color, alpha) hinzugefügt#
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
fig, ax = plt.subplots()
rectangle = Rectangle((.2, .2), .6, .6,
facecolor=('blue', 0.2),
edgecolor=('green', 0.5))
ax.add_patch(rectangle)
Benutzer können eine Farbe mit der neuen Farbspezifikation (matplotlib_color, alpha) definieren. Beachten Sie, dass ein explizites Alpha-Schlüsselwortargument einen Alpha-Wert aus (matplotlib_color, alpha) überschreibt.
Der Schatten von Tortendiagrammen kann gesteuert werden#
Das Argument shadow für pie kann nun ein Dictionary sein, was mehr Kontrolle über den verwendeten Shadow-Patch ermöglicht.
PolyQuadMesh ist eine neue Klasse zum Zeichnen von Vierecknetzen
pcolor gab zuvor eine abgeflachte PolyCollection zurück, die nur die gültigen (unmaskierten) Polygone enthielt. Nun geben wir eine PolyQuadMesh zurück, die Nützlichkeit von 2D-Array- und Netzkoordinatenbehandlung integriert, aber dennoch die Zeichenmethoden von PolyCollection erbt, was mehr Kontrolle über die Rendering-Eigenschaften ermöglicht als eine normale QuadMesh, die von pcolormesh zurückgegeben wird. Die neue Klasse erbt von PolyCollection und sollte sich daher wie zuvor verhalten. Diese neue Klasse verfolgt die Maske für den Benutzer und aktualisiert die an den Renderer gesendeten Polygone entsprechend.
Schattentönung kann gesteuert werden#
Das Shadow-Patch hat jetzt ein shade-Argument zur Steuerung der Schatten-Dunkelheit. Wenn 1, ist der Schatten schwarz, wenn 0, hat der Schatten die gleiche Farbe wie das beschattete Patch. Der Standardwert, der früher fest war, ist 0.7.
SpinesProxy unterstützt jetzt den Aufruf der set() Methode#
Man kann nun z.B. ax.spines[:].set(visible=False) aufrufen.
Schriftarten für Tick-Labels können mit einem Schlüsselwortargument gesetzt werden#
Axes.tick_params akzeptiert nun das Schlüsselwort labelfontfamily, das die Schriftart der Tick-Labels getrennt von den anderen Textelementen ändert.
Axis.tick_params(labelfontfamily='monospace')
Figuren-, Achsen- und Legenden-Layout#
pad_inches="layout" für savefig#
Bei Verwendung von Constrained oder Compressed Layout,
savefig(filename, bbox_inches="tight", pad_inches="layout")
wird nun die auf der Layout-Engine definierten Polstergrößen verwenden.
Öffentliche Methode zum Ändern der Position einer Legend hinzugefügt#
Legenden-Positionen können nun nach ihrer Definition angepasst werden.
from matplotlib import pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
x = list(range(-100, 101))
y = [i**2 for i in x]
ax.plot(x, y, label="f(x)")
ax.legend()
ax.get_legend().set_loc("right")
# Or
# ax.get_legend().set(loc="right")
plt.show()
rcParams['legend.loc'] akzeptiert jetzt Float-Tupel-Eingaben#
Die rcParams rcParams["legend.loc"] (Standard: 'best') akzeptiert nun Float-Tupel-Eingaben, genau wie das loc-Schlüsselwortargument für Legend. Dies ermöglicht es Benutzern, die Position der Legende flexibler und konsistenter festzulegen.
Mathtext-Verbesserungen#
Die Verbesserungen betreffen Mathtext, Matplotlibs native TeX-ähnliche mathematische Parser (siehe Mathematische Ausdrücke schreiben, nicht zu verwechseln mit Matplotlib, das LaTeX direkt verwendet: Textdarstellung mit LaTeX).
Boldsymbol Mathtext-Befehl \boldsymbol#
Unterstützung für die Verwendung des Befehls \boldsymbol{} in Mathtext.
Um Symbole fett zu machen, umschließen Sie den Text mit einem Font-Befehl, wie gezeigt.
r'$\boldsymbol{a+2+\alpha}$'
mathtext hat besser skalierbare Trennzeichen#
Die skalierbaren Trennzeichen \lgroup und \rgroup wurden hinzugefügt.
Die folgenden Trennzeichennamen wurden bereits früher unterstützt, können aber nun mit \left und \right skaliert werden:
\lbrace,\rbrace,\leftbraceund\rightbrace\lbrackund\rbrack\leftparenund\rightparen
Es gibt keine offensichtlichen Vorteile bei der Verwendung dieser. Stattdessen wurden sie zur Vollständigkeit hinzugefügt.
mathtext Dokumentationsverbesserungen#
Die Dokumentation wird aktualisiert, um Informationen direkt aus dem Parser zu übernehmen. Das bedeutet, dass (fast) alle unterstützten Symbole, Operatoren usw. unter Mathematische Ausdrücke schreiben angezeigt werden.
mathtext unterstützt jetzt \substack#
\substack kann verwendet werden, um mehrzeilige Tief- oder Hochstellungen innerhalb einer Gleichung zu erstellen.
Um sie zu verwenden, umschließen Sie die Mathematik in einem substack-Befehl, wie gezeigt.
r'$\sum_{\substack{1\leq i\leq 3\\ 1\leq j\leq 5}}$'

mathtext unterstützt jetzt das Trennzeichen \middle#
Das Trennzeichen \middle wurde hinzugefügt und kann nun mit den Trennzeichen \left und \right verwendet werden.
Um den middle-Befehl zu verwenden, umschließen Sie ihn zwischen dem \left und \right Trennzeichenbefehl, wie gezeigt.
r'$\left( \frac{a}{b} \middle| q \right)$'

mathtext Operatoren#
Eine Reihe von Operatoren wurde hinzugefügt und korrigiert, wenn eine Unicode-Schriftart verwendet wird. Zusätzlich wurde die korrekte Abstandssetzung für eine Reihe früherer Operatoren hinzugefügt. Insbesondere wurden die Zeichen für \gnapprox, \lnapprox, \leftangle und \rightangle korrigiert.
mathtext Abstandssetzungskorrekturen#
Als Konsequenz der aktualisierten Dokumentation wurden die Abstände bei einer Reihe von relationalen und operatorenbezogenen Symbolen entsprechend klassifiziert und werden daher korrekt gesetzt.
mathtext unterstützt jetzt \text#
\text kann verwendet werden, um aufrechte Texte in einer Gleichung zu erhalten und einen einfachen Bindestrich (-) zu erzeugen.
import matplotlib.pyplot as plt
plt.text(0.1, 0.5, r"$a = \sin(\phi) \text{ such that } \phi = \frac{x}{y}$")
plt.text(0.1, 0.3, r"$\text{dashes (-) are retained}$")
Fett-Kursiv-Mathtext-Befehl \mathbfit#
Unterstützung für die Verwendung von fett-kursiver Schriftart in Mathtext mit dem Befehl \mathbfit{}.
Um die Schriftart auf fett und kursiv zu ändern, umschließen Sie den Text mit einem Font-Befehl, wie gezeigt.
r'$\mathbfit{\eta \leq C(\delta(\eta))}$
3D-Plot-Verbesserungen#
Positionen von Ticks und Achsenbeschriftungen für 3D-Plots festlegen#
Sie können nun die Positionen von Ticks und Achsenbeschriftungen für 3D-Plots festlegen.
import matplotlib.pyplot as plt
positions = ['lower', 'upper', 'default', 'both', 'none']
fig, axs = plt.subplots(2, 3, figsize=(12, 8),
subplot_kw={'projection': '3d'})
for ax, pos in zip(axs.flatten(), positions):
for axis in ax.xaxis, ax.yaxis, ax.zaxis:
axis.set_label_position(pos)
axis.set_ticks_position(pos)
title = f'position="{pos}"'
ax.set(xlabel='x', ylabel='y', zlabel='z', title=title)
axs[1, 2].axis('off')
3D-Hover-Koordinaten#
Die X-, Y- und Z-Koordinaten, die in 3D-Plots angezeigt wurden, zeigten zuvor unsinnige Werte. Dies wurde behoben, um die Koordinate auf der Ansichtsebene direkt unter dem Mauszeiger anzuzeigen. Dies ist wahrscheinlich am nützlichsten, wenn 3D-Plots entlang einer primären Achsenrichtung mit einer orthografischen Projektion betrachtet werden oder wenn ein 2D-Plot auf eine der 3D-Achsen projiziert wurde. Beachten Sie, dass es immer noch keine Möglichkeit gibt, die Koordinaten von geplotteten Datenpunkten direkt anzuzeigen.
Weitere Verbesserungen#
macosx: Neue Abbildungen können in Fenstern oder Tabs geöffnet werden#
Es gibt einen neuen rcParams["macosx.window_mode"] (Standard: 'system') rcParam, um zu steuern, wie neue Abbildungen mit dem macosx-Backend geöffnet werden. Der Standardwert ist system, der die Systemeinstellungen verwendet, oder man kann entweder tab oder window angeben, um den Modus zum Öffnen neuer Abbildungen explizit auszuwählen.
matplotlib.mpl_toolkits ist jetzt ein implizites Namespace-Paket#
Nach der Deprezierung von pkg_resources.declare_namespace in setuptools 67.3.0 wird matplotlib.mpl_toolkits nun gemäß PEP 420 als impliziter Namespace implementiert.
Plot-Direktive kann jetzt responsive Bilder mit "srcset" erstellen#
Die Plot-Sphinx-Direktive (matplotlib.sphinxext.plot_directive, in rst als .. plot:: aufgerufen) kann so konfiguriert werden, dass automatisch höher auflösende Bilder erstellt und diese den erstellten HTML-Dokumenten hinzugefügt werden. In conf.py
extensions = [
...
'matplotlib.sphinxext.plot_directive',
'matplotlib.sphinxext.figmpl_directive',
...]
plot_srcset = ['2x']
werden PNG-Dateien mit doppelter Auflösung für hiDPI-Displays erstellt. Die resultierenden HTML-Dateien enthalten Bildeinträge wie
<img src="../_images/nestedpage-index-2.png" style="" srcset="../_images/nestedpage-index-2.png, ../_images/nestedpage-index-2.2x.png 2.00x" alt="" class="plot-directive "/>