Neues in Matplotlib 3.5.0 (15. Nov. 2021)#
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).
Erstellung / Verwaltung von Figuren und Axes#
subplot_mosaic unterstützt einfaches Teilen von Axes#
Figure.subplot_mosaic, pyplot.subplot_mosaic unterstützen einfaches Teilen von Axes (d.h. nur True/False können an sharex/sharey übergeben werden). Wenn True, werden die Sichtbarkeit der Tick-Labels und die Achseneinheiten geteilt.
mosaic = [
['A', [['B', 'C'],
['D', 'E']]],
['F', 'G'],
]
fig = plt.figure(constrained_layout=True)
ax_dict = fig.subplot_mosaic(mosaic, sharex=True, sharey=True)
# All Axes use these scales after this call.
ax_dict['A'].set(xscale='log', yscale='logit')
Figure hat jetzt die Methode draw_without_rendering#
Einige Aspekte einer Figur werden erst zur Zeichenzeit bestimmt, wie die genaue Position von Textkünstlern oder verzögerte Berechnungen wie automatische Datenlimits. Wenn Sie diese Werte benötigen, können Sie figure.canvas.draw() verwenden, um ein vollständiges Zeichnen zu erzwingen. Dies hat jedoch Nebenwirkungen, erfordert manchmal eine geöffnete Datei und ist mehr Arbeit als nötig.
Die neue Methode Figure.draw_without_rendering führt alle Aktualisierungen durch, die draw() durchführt, überspringt aber das Rendern der Figur. Sie ist daher effizienter, wenn Sie die aktualisierten Werte benötigen, um weitere Aspekte der Figur zu konfigurieren.
Figure __init__ leitet Schlüsselwortargumente an set weiter#
Ähnlich wie viele andere Unterklassen von Artist leiten die Klassen FigureBase, SubFigure und Figure nun alle zusätzlichen Schlüsselwortargumente an set weiter, um die Eigenschaften des neu erstellten Objekts bei der Initialisierung festlegen zu können. Zum Beispiel
from matplotlib.figure import Figure
fig = Figure(label='my figure')
Plotting-Methoden#
Hinzufügen des Annulus-Patches#
Annulus ist eine neue Klasse zum Zeichnen von elliptischen Annuli.
set_data-Methode für FancyArrow-Patch#
FancyArrow, der Patch, der von ax.arrow zurückgegeben wird, verfügt nun über eine set_data-Methode, die es ermöglicht, den Pfeil nach der Erstellung zu ändern, z.B. für Animationen.
Neue Pfeilstile in ArrowStyle und ConnectionPatch#
Der neue Parameter arrow für ArrowStyle ersetzt die Verwendung der Parameter beginarrow und endarrow bei der Erstellung von Pfeilen. Er nimmt Pfeilstreifen wie '<-', ']-[' und ']->' anstelle von einzelnen Booleans entgegen.
Zwei neue Stile ']->' und '<-[' werden ebenfalls über diesen Mechanismus hinzugefügt. ConnectionPatch, das Pfeilstile über seinen Parameter arrowstyle akzeptiert, akzeptiert auch diese neuen Stile.
Offset-Transform-Einstellung für Collections nach Initialisierung#
Die hinzugefügte Methode collections.Collection.set_offset_transform kann verwendet werden, um die Offset-Transform nach der Initialisierung festzulegen. Dies kann hilfreich sein, wenn eine collections.Collection außerhalb eines Axes-Objekts erstellt und später mit Axes.add_collection() hinzugefügt und die Offset-Transform auf Axes.transData gesetzt wird.
Farben und Colormaps#
Colormap-Registrierung (experimentell)#
Colormaps werden jetzt über matplotlib.colormaps (oder pyplot.colormaps) verwaltet, was eine ColormapRegistry ist. Obwohl wir zuversichtlich sind, dass die API final ist, markieren wir sie für 3.5 formell als experimentell, da wir die Option behalten möchten, die API für 3.6 bei Bedarf noch zu ändern.
Colormaps können über den Elementzugriff bezogen werden
import matplotlib.pyplot as plt
cmap = plt.colormaps['viridis']
Zur Registrierung neuer Colormaps verwenden Sie
plt.colormaps.register(my_colormap)
Wir empfehlen, die neue API anstelle der Funktionen matplotlib.cm.get_cmap und matplotlib.cm.register_cmap für neuen Code zu verwenden. matplotlib.cm.get_cmap und matplotlib.cm.register_cmap werden schließlich als veraltet markiert und entfernt. Innerhalb von pyplot werden plt.get_cmap() und plt.register_cmap() weiterhin zur Abwärtskompatibilität unterstützt.
Bildinterpolation nun im RGBA-Stadium möglich#
Bilder in Matplotlib, die über imshow erstellt werden, werden neu abgetastet, um der Auflösung der aktuellen Leinwand zu entsprechen. Es ist nützlich, einen Anti-Aliasing-Filter beim Herunterabtasten anzuwenden, um Moiré-Effekte zu reduzieren. Standardmäßig erfolgt die Interpolation auf den Daten, gefolgt von einer Normierung und dann der Colormapping.
Es ist jedoch oft wünschenswert, dass die Anti-Aliasing-Interpolation im RGBA-Raum erfolgt, wo die Farben interpoliert werden und nicht die Daten. Dies führt normalerweise zu Farben außerhalb des Colormaps, vermischt aber visuell benachbarte Farben und ist das, was Browser und andere Bildverarbeitungssoftware tun.
Ein neues Schlüsselwortargument interpolation_stage wird für imshow bereitgestellt, um das Stadium festzulegen, in dem die Anti-Aliasing-Interpolation stattfindet. Der Standardwert ist das aktuelle Verhalten von "data", mit der Alternative "rgba" für das neu verfügbare Verhalten.
Beispiel für die Interpolationsstufen-Optionen.#
Weitere Details finden Sie in der Diskussion des neuen Schlüsselwortarguments in Bild-Neubewertung (Image resampling).
imshow unterstützt Half-Float-Arrays#
Die Methode imshow unterstützt nun Half-Float-Arrays, d.h. NumPy-Arrays mit dem Datentyp np.float16.
Eine Callback-Registrierung wurde zu Normalize-Objekten hinzugefügt#
colors.Normalize-Objekte verfügen nun über eine Callback-Registrierung, callbacks, an die sich andere Objekte anschließen können, um benachrichtigt zu werden, wenn die Norm aktualisiert wird. Der Callback sendet den Schlüssel changed, wenn die Norm modifiziert wird. cm.ScalarMappable ist nun ein Zuhörer und registriert eine Änderung, wenn die Attribute vmin, vmax oder andere Attribute der Norm geändert werden.
Titel, Ticks und Labels#
Gleichzeitiges Setzen von Tick-Positionen und -Labels in set_ticks#
Axis.set_ticks (und die entsprechenden Axes.set_xticks / Axes.set_yticks) haben einen neuen Parameter labels, der das gleichzeitige Setzen von Tick-Positionen und -Labels ermöglicht.
Zuvor wurden Tick-Labels mit Axis.set_ticklabels (oder den entsprechenden Axes.set_xticklabels / Axes.set_yticklabels) gesetzt; dies ist normalerweise nur sinnvoll, wenn Tick-Positionen zuvor mit set_ticks festgelegt wurden.
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(['a', 'b', 'c'])
Die kombinierte Funktionalität ist nun in set_ticks verfügbar.
ax.set_xticks([1, 2, 3], ['a', 'b', 'c'])
Die Verwendung von Axis.set_ticklabels wird nicht empfohlen, bleibt aber aus Kompatibilitätsgründen erhalten.
Hinweis: Diese Ergänzung macht die API von set_ticks auch ähnlicher zu pyplot.xticks / pyplot.yticks, die bereits den zusätzlichen Parameter labels hatten.
Schriften und Text#
Drei- und vierfache Punkt-Akzente in Mathtext#
Zusätzlich zu Einzel- und Doppelpunkt-Akzenten unterstützt Mathtext nun auch Drei- und Vierfachpunkt-Akzente.
fig = plt.figure(figsize=(3, 1))
fig.text(0.5, 0.5, r'$\dot{a} \ddot{b} \dddot{c} \ddddot{d}$', fontsize=40,
horizontalalignment='center', verticalalignment='center')
Schriftarteigenschaften des Legendentitels sind konfigurierbar#
Die Schriften des Titels können über das Schlüsselwortargument title_fontproperties eingestellt werden, z.B.
Text und TextBox haben die Option parse_math erhalten#
Text und TextBox-Objekte erlauben nun ein schlüsselwort-only Argument parse_math, das steuert, ob Mathematik aus dem angezeigten String geparst werden soll. Wenn True, wird der String als Mathtext-Objekt geparst. Wenn False, wird der String als Literal betrachtet und es erfolgt keine Parsierung.
Text kann innerhalb des TextBox-Widgets positioniert werden#
Ein neuer Parameter namens textalignment kann verwendet werden, um die Position des Textes innerhalb des Axes des TextBox-Widgets zu steuern.
Vereinfachung der Schriftarteinstellung für den usetex-Modus#
Nun akzeptiert rcParams["font.family"] (Standard: ['sans-serif']) einige Schriftartennamen als Wert für eine benutzerfreundlichere Einrichtung.
plt.rcParams.update({
"text.usetex": True,
"font.family": "Helvetica"
})
Typ-42-Unterteilung ist jetzt für PDF/PS-Backends aktiviert#
backend_pdf und backend_ps verwenden nun eine einheitliche Typ-42-Schriftart-Unterteilungs-Schnittstelle, mit Hilfe von fontTools.
Setzen Sie rcParams["pdf.fonttype"] (Standard: 3) oder rcParams["ps.fonttype"] (Standard: 3) auf 42, um diesen Workflow auszulösen.
# for PDF backend
plt.rcParams['pdf.fonttype'] = 42
# for PS backend
plt.rcParams['ps.fonttype'] = 42
fig, ax = plt.subplots()
ax.text(0.4, 0.5, 'subsetted document is smaller in size!')
fig.savefig("document.pdf")
fig.savefig("document.ps")
rcParams-Verbesserungen#
Erlaubt globales Setzen der Standard-Legenden-Label-Farbe#
Ein neues rcParams["legend.labelcolor"] (Standard: 'None') setzt das Standardargument labelcolor für Figure.legend. Die speziellen Werte 'linecolor', 'markerfacecolor' (oder 'mfc') oder 'markeredgecolor' (oder 'mec') bewirken, dass der Legendentext mit der entsprechenden Farbe des Markers übereinstimmt.
3D-Achsen-Verbesserungen#
Axes3D erlaubt nun manuelle Kontrolle der Zeichenreihenfolge#
Die Klasse Axes3D hat nun den Parameter computed_zorder. Wenn auf False gesetzt, werden Künstler (Artists) unter Verwendung ihres zorder-Attributs gezeichnet.
Erlaubt Ändern der vertikalen Achse in 3D-Plots#
view_init hat nun den Parameter vertical_axis, der das Umschalten der vertikalen Achse erlaubt.
plot_surface unterstützt Masked Arrays und NaNs#
axes3d.Axes3D.plot_surface unterstützt Masked Arrays und NaNs und wird nun Quadrate, die maskierte oder NaN-Punkte enthalten, ausblenden. Das Verhalten ähnelt dem von Axes.contour mit corner_mask=True.
3D-Plot-Methoden unterstützen das Schlüsselwortargument data#
Um allen 2D-Plot-Methoden zu entsprechen, unterstützen die 3D-Axes nun das Schlüsselwortargument data. Dies ermöglicht die indirekte Übergabe von Argumenten aus einer DataFrame-ähnlichen Struktur.
data = { # A labelled data set, or e.g., Pandas DataFrame.
'x': ...,
'y': ...,
'z': ...,
'width': ...,
'depth': ...,
'top': ...,
}
fig, ax = plt.subplots(subplot_kw={'projection': '3d')
ax.bar3d('x', 'y', 'z', 'width', 'depth', 'top', data=data)
Verbesserungen interaktiver Werkzeuge#
Colorbars haben jetzt Pan- und Zoom-Funktionalität#
Interaktive Plots mit Colorbars können nun auf der Colorbar-Achse gezoomt und verschoben werden. Dies passt die vmin und vmax der ScalarMappable an, die mit der Colorbar assoziiert ist. Dies ist derzeit nur für kontinuierliche Normen aktiviert. Normen, die mit contourf und kategorialen Werten verwendet werden, wie z.B. BoundaryNorm und NoNorm, haben die interaktive Funktionalität standardmäßig deaktiviert. cb.ax.set_navigate() kann verwendet werden, um festzulegen, ob eine Colorbar-Achse interaktiv ist oder nicht.
Aktualisierung des Erscheinungsbildes von Slider-Widgets#
Das Erscheinungsbild von Slider- und RangeSlider-Widgets wurde aktualisiert und neue Styling-Parameter für die hinzugefügten Griffe erhalten.
Entfernen von Punkten auf einem PolygonSelector#
Nach Abschluss eines PolygonSelector können einzelne Punkte nun durch Rechtsklick darauf entfernt werden.
Ziehen von Selektoren#
Die SpanSelector, RectangleSelector und EllipseSelector haben ein neues Schlüsselwortargument, drag_from_anywhere, das, wenn es auf True gesetzt ist, es Ihnen ermöglicht, von überall innerhalb des Selektors zu klicken und zu ziehen, um ihn zu verschieben. Zuvor war es nur möglich, ihn zu verschieben, indem entweder die Move-Modifier-Taste aktiviert oder auf den zentralen Griff geklickt wurde.
Die Größe der SpanSelector kann jetzt über die Randgriffe geändert werden.
Selektoren löschen#
Die Selektoren (EllipseSelector, LassoSelector, PolygonSelector, RectangleSelector und SpanSelector) haben eine neue Methode clear, die die aktuelle Auswahl löscht und den Selektor für eine neue Auswahl vorbereitet. Dies entspricht dem Drücken der Escape-Taste.
Eigenschaften von Künstlerobjekten von Selektoren festlegen#
Die Eigenschaften von Künstlerobjekten der Selektoren EllipseSelector, LassoSelector, PolygonSelector, RectangleSelector und SpanSelector können mit den Methoden set_props und set_handle_props geändert werden.
Ereignisse außerhalb der Auswahl ignorieren#
Die Selektoren EllipseSelector, RectangleSelector und SpanSelector haben ein neues Schlüsselwortargument, ignore_event_outside, das, wenn es auf True gesetzt ist, Ereignisse außerhalb der aktuellen Auswahl ignoriert. Stattdessen können die Griffe oder die neue Ziehfunktionalität verwendet werden, um die Auswahl zu ändern.
CallbackRegistry-Objekte erhalten eine Methode zum vorübergehenden Blockieren von Signalen#
Der Kontextmanager blocked kann verwendet werden, um zu verhindern, dass Callback-Signale vom CallbackRegistry verarbeitet werden. Das optionale Schlüsselwort signal kann verwendet werden, um ein bestimmtes Signal von der Verarbeitung zu blockieren und alle anderen Signale zuzulassen.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.imshow([[0, 1], [2, 3]])
# Block all interactivity through the canvas callbacks
with fig.canvas.callbacks.blocked():
plt.show()
fig, ax = plt.subplots()
ax.imshow([[0, 1], [2, 3]])
# Only block key press events
with fig.canvas.callbacks.blocked(signal="key_press_event"):
plt.show()
Richtungsabhängige Größenänderungscursor#
Leinwände unterstützen jetzt das Setzen von richtungsabhängigen Größenänderungscursorn, d. h. horizontalen und vertikalen Doppelpfeilen. Diese werden z. B. in Selektor-Widgets verwendet. Probieren Sie das Mauscursor-Beispiel aus, um den Cursor in Ihrem gewünschten Backend zu sehen.
Sphinx-Erweiterungen#
Weitere Konfiguration der Sphinx-Erweiterung mathmpl#
Die Sphinx-Erweiterung matplotlib.sphinxext.mathmpl unterstützt zwei neue Konfigurationsoptionen, die in Ihrer conf.py angegeben werden können.
mathmpl_fontsize(float), die die Schriftgröße des mathematischen Textes in Punkten festlegt;mathmpl_srcset(Liste von Zeichenketten), die eine Liste von Größen bereitstellt, um responsive Auflösungsbilder zu unterstützen. Die Liste sollte zusätzliche x-Deskriptoren ('1.5x','2x'usw.) enthalten, um diese zu generieren (1x ist der Standard und immer enthalten).
Backend-spezifische Verbesserungen#
GTK-Backend#
Ein Backend, das GTK4 unterstützt, wurde hinzugefügt. Sowohl Agg- als auch Cairo-Renderer werden unterstützt. Die GTK4-Backends können als GTK4Agg oder GTK4Cairo ausgewählt werden.
Qt-Backends#
Unterstützung für Qt6 (mit entweder PyQt6 oder PySide6) wurde hinzugefügt, mit entweder Agg- oder Cairo-Renderern. Gleichzeitig wurde die Unterstützung für Qt4 eingestellt. Sowohl Qt6 als auch Qt5 werden von einem kombinierten Backend (QtAgg oder QtCairo) unterstützt, und die geladene Version wird durch bereits importierte Module, die Umgebungsvariable QT_API und verfügbare Pakete bestimmt. Weitere Details finden Sie unter Qt-Bindings. Die versionsspezifischen Qt5-Backend-Namen (Qt5Agg oder Qt5Cairo) bleiben zur Abwärtskompatibilität unterstützt.
HiDPI-Unterstützung in Cairo-basierten, GTK- und Tk-Backends#
Die GTK3-Backends unterstützen jetzt HiDPI vollständig, einschließlich gemischter Monitorfälle (nur unter Wayland). Die neu hinzugefügten GTK4-Backends unterstützen ebenfalls HiDPI.
Das TkAgg-Backend unterstützt HiDPI jetzt **nur unter Windows**, einschließlich gemischter Monitorfälle.
Alle Cairo-basierten Backends unterstützen HiDPI genauso korrekt wie ihre Agg-Gegenstücke (d. h. wenn das Toolkit HiDPI unterstützt, dann unterstützt das *Cairo-Backend dies jetzt, aber nicht andersherum).
Verbesserungen des Qt-Figuren-Optionen-Editors#
Der Optionen-Editor für Figuren im Qt-Backend unterstützt jetzt auch die Bearbeitung von linken und rechten Titeln (zusätzlich zum vorhandenen mittleren Titel). Die Bearbeitung von Achsenlimits wird bei Verwendung eines Datumskonverters besser unterstützt. Die Option symlog ist nun in den Optionen für die Achsenskalierung verfügbar. Alle Einträge mit demselben Label werden nun im Reiter "Kurven" angezeigt.
WebAgg verwendet asyncio anstelle von Tornado#
Das WebAgg-Backend verwendet standardmäßig asyncio anstelle von Tornado für die Timer-Unterstützung. Dies ermöglicht die Verwendung des WebAgg-Backends in JupyterLite.
Versionsinformationen#
Wir sind auf das release-branch-semver-Versionierungsschema von setuptools-scm umgestiegen. Dies wirkt sich nur auf die Versionsinformationen für Entwicklungs-Builds aus. Ihre Versionsnummer beschreibt nun die Zielversion, d. h. 3.5.0.dev820+g6768ef8c4c sind 820 Commits nach der vorherigen Veröffentlichung und werden später offiziell als 3.5.0 veröffentlicht.
Zusätzlich zur Zeichenkette __version__ gibt es jetzt auch ein benanntes Tupel __version_info__, das nach dem Vorbild von sys.version_info erstellt wurde. Sein Hauptzweck ist der sichere Vergleich von Versionsinformationen, z. B. if __version_info__ >= (3, 4, 2).