API-Änderungen für 3.9.0#

Verhaltensänderungen#

Das Kurzformat von plot() interpretiert "Cn" (n>9) als eine Farbe aus dem Farbzyklus#

Zuvor wurde plot(..., "-C11") als Aufforderung zu einem Plot mit dem Linienstil "-", der Farbe "C1" (Farbe Nr. 1 des Farbzyklus) und dem Marker "1" ("tri-down") interpretiert. Nun wird es als Aufforderung zu einem Plot mit dem Linienstil "-" und der Farbe "C11" (Farbe Nr. 11 des Farbzyklus) interpretiert.

Es wird empfohlen, mehrdeutige Marker (wie "1") explizit über das Schlüsselwortargument marker zu übergeben. Wenn das Kurzformat gewünscht ist, können solche Marker auch eindeutig gesetzt werden, indem sie vor den Farbstring gestellt werden.

Legendenbeschriftungen für plot#

Zuvor wurde, wenn eine Sequenz an den Parameter label von plot übergeben wurde, während ein einzelnes Dataset geplottet wurde, die Sequenz automatisch in einen String für die Legendenbeschriftung umgewandelt. Nun, wenn die Sequenz nur ein Element hat, wird dieses Element die Legendenbeschriftung sein. Um das alte Verhalten beizubehalten, wandeln Sie die Sequenz vor der Übergabe in einen String um.

Boxplots ignorieren nun maskierte Datenpunkte#

boxplot und boxplot_stats ignorieren nun alle maskierten Punkte in den Eingabedaten.

axhspan und axvspan geben nun Rectangles und keine Polygons mehr zurück#

Diese Änderung ermöglicht die Verwendung von axhspan zum Zeichnen eines Rings auf polaren Achsen.

Diese Änderung betrifft auch andere Elemente, die über axhspan und axvspan erstellt werden, wie z.B. Slider.poly.

Verbesserte Handhabung von Pan/Zoom-Ereignissen überlappender Achsen#

Die Weiterleitung von Pan/Zoom-Ereignissen wird nun durch die Sichtbarkeit des Hintergrund-Patches (z.B. ax.patch.get_visible()) und durch den zorder der Achsen bestimmt.

  • Achsen mit einem sichtbaren Patch fangen das Ereignis ab und leiten es nicht an Achsen darunter weiter. Nur die Achsen mit dem höchsten zorder, die das Ereignis enthalten, werden ausgelöst (wenn mehrere Achsen den gleichen zorder haben, zählt die zuletzt hinzugefügte Achse).

  • Achsen mit einem unsichtbaren Patch sind auch für Ereignisse unsichtbar und diese werden an die Achsen darunter weitergeleitet.

Um das Standardverhalten zu überschreiben und explizit festzulegen, ob eine Achse Navigationsereignisse weiterleiten soll, verwenden Sie Axes.set_forward_navigation_events.

loc='best' für legend berücksichtigt nun Text und PolyCollections#

Die Standortauswahl für legend berücksichtigt nun die Existenz von Text und PolyCollections bei der Berechnung der "Schlechtigkeit" (badness).

Hinweis: Die Option best kann bei Plots mit großen Datenmengen bereits recht langsam sein. Für PolyCollections werden nur die Path von PolyCollections und nicht der eingeschlossene Bereich bei der Überprüfung auf Überlappungen berücksichtigt, um zusätzliche Latenz zu reduzieren. Sie kann jedoch immer noch recht langsam sein, wenn viele PolyCollections im Plot vorhanden sind, die überprüft werden müssen.

Ausnahme beim Nicht-Übergeben eines Bbox an BboxTransform*-Klassen#

Die Ausnahme, die ausgelöst wird, wenn kein Bbox an BboxTransform*-Klassen übergeben wird, die einen erwarten (z.B. BboxTransform), hat sich von ValueError zu TypeError geändert.

Der loc-Parameter von Cell akzeptiert nicht mehr None#

Der Standardwert des loc-Parameters wurde von None auf right geändert, was bereits die Standardposition war. Das Verhalten von Cell hat sich nicht geändert, wenn es ohne expliziten loc-Parameter aufgerufen wird.

ContourLabeler.add_label berücksichtigt nun use_clabeltext#

... und setzt Text.set_transform_rotates_text entsprechend.

Line2D#

Beim Erstellen einer Line2D oder bei der Verwendung von Line2D.set_xdata und Line2D.set_ydata ist die Übergabe von x/y-Daten als Nicht-Sequenz nun ein Fehler.

ScalarMappables skalieren ihre Norm automatisch, wenn ein Array gesetzt wird#

Collections verzögerten zuvor die automatische Skalierung der Norm bis zum Zeichenzeitpunkt. Dies wurde geändert, um die Norm immer dann zu skalieren, wenn das erste Array gesetzt wird, um mit der Dokumentation übereinzustimmen und unerwartetes Verhalten beim Zugriff auf die Norm vor dem Zeichnen zu reduzieren.

SubplotParams wurde von matplotlib.figure nach matplotlib.gridspec verschoben#

Es ist weiterhin von matplotlib.figure importierbar, sodass keine Änderungen am bestehenden Code erforderlich sind.

PowerNorm schneidet Werte unterhalb von vmin nicht mehr ab#

Wenn clip=False (der Standardwert) bei PowerNorm gesetzt ist, werden Werte unterhalb von vmin nun linear normalisiert. Zuvor wurden sie auf Null abgeschnitten. Dies behebt Probleme mit der Anzeige von Farbleisten, die mit einer Power-Norm verbunden sind.

Semantik von Bildpfaden von Toolmanager-basierten Werkzeugen#

Zuvor versuchten MEP22 ("toolmanager-based") Tools, ihr Symbol (tool.image) relativ zum aktuellen Arbeitsverzeichnis zu laden oder als Fallback aus Matplotlibs eigenem Bildverzeichnis. Da beide Ansätze für Drittanbieter-Tools problematisch sind (der Endbenutzer kann das aktuelle Arbeitsverzeichnis jederzeit ändern, und Drittanbieter können keine neuen Symbole im Bildverzeichnis von Matplotlib hinzufügen), ist dieses Verhalten veraltet. Stattdessen wird tool.image nun relativ zu dem Verzeichnis interpretiert, das die Quelldatei enthält, in der das Klassenattribut Tool.image definiert ist. (Die Definition von tool.image als absoluter Pfad funktioniert ebenfalls und ist sowohl mit der alten als auch mit der neuen Semantik kompatibel.)

Veralterungen#

plot_date#

Die Verwendung von plot_date wird seit Matplotlib 3.5 nicht mehr empfohlen und die Funktion ist nun formell veraltet.

  • datetime-ähnliche Daten sollten direkt mit plot geplottet werden.

  • Wenn Sie reine numerische Daten als Matplotlib Datumsformat plotten oder eine Zeitzone festlegen müssen, rufen Sie ax.xaxis.axis_date / ax.yaxis.axis_date auf, bevor Sie plot aufrufen. Siehe Axis.axis_date.

Legendenbeschriftungen für plot#

Zuvor wurde, wenn eine Sequenz an den label-Parameter von plot übergeben wurde, während ein einzelnes Dataset geplottet wurde, die Sequenz automatisch in einen String für die Legendenbeschriftung umgewandelt. Dieses Verhalten ist nun veraltet und wird zukünftig einen Fehler auslösen, wenn die Länge der Sequenz nicht eins ist (konsistent mit dem Verhalten für mehrere Datensätze, bei dem die Anzahl der Elemente mit der Anzahl der Datensätze übereinstimmen muss). Um das alte Verhalten beizubehalten, wandeln Sie die Sequenz vor der Übergabe in einen String um.

boxplot Tick-Labels#

Der Parameter labels wurde zur besseren Klarheit und Konsistenz mit bar in tick_labels umbenannt.

Mischen von positionsbezogenen und schlüsselwortbezogenen Argumenten für legend Handles und Labels#

Dies löste bisher nur eine Warnung aus, ist aber nun formell veraltet. Wenn handles und labels übergeben werden, müssen sie entweder beide positionsbezogen oder beide als Schlüsselwort übergeben werden.

Anwendung von Theta-Transformationen in PolarTransform#

Die Anwendung von Theta-Transformationen in PolarTransform und InvertedPolarTransform ist veraltet und wird in einer zukünftigen Version von Matplotlib entfernt. Dies ist derzeit das Standardverhalten, wenn diese Transformationen extern verwendet werden, wirkt sich jedoch nur aus, wenn

  • Eine Achse mit der Transformation verknüpft ist.

  • Die Achse einen Theta-Offset ungleich Null hat oder wenn Theta-Werte in einer Clockwise-Richtung zunehmen.

Um diese Warnung zu unterdrücken und das zukünftige Verhalten zu übernehmen, setzen Sie apply_theta_transforms=False. Wenn Sie das Verhalten beibehalten möchten, bei dem Theta-Werte transformiert werden, verketten Sie die PolarTransform mit einer Affine2D-Transformation, die die Theta-Verschiebung und/oder Vorzeichenverschiebung durchführt.

interval-Parameter von TimerBase.start#

Das Setzen des Timer-interval beim Starten ist veraltet. Das Intervall kann stattdessen im Timer-Konstruktor angegeben oder durch Setzen des Attributs timer.interval geändert werden.

nth_coord-Parameter für axisartist-Helfer für feste Achsen#

Hilfs-APIs in axisartist zum Erzeugen einer "festen" Achse auf rechtwinkligen Achsen (FixedAxisArtistHelperRectilinear) akzeptieren keinen nth_coord-Parameter mehr, da dieser Parameter vollständig aus dem (erforderlichen) loc-Parameter abgeleitet wird und inkonsistente nth_coord und loc ein Fehler sind.

Für gekrümmte Achsen bleibt der nth_coord-Parameter unterstützt (er beeinflusst die Ticks, nicht die Achsenposition selbst), wird aber für Konsistenz mit dem rechtwinkligen Fall zu einem schlüsselwortbasierten Argument.

rcsetup.interactive_bk, rcsetup.non_interactive_bk und rcsetup.all_backends#

... sind veraltet und werden durch matplotlib.backends.backend_registry.list_builtin mit den folgenden Argumenten ersetzt:

  • matplotlib.backends.BackendFilter.INTERACTIVE

  • matplotlib.backends.BackendFilter.NON_INTERACTIVE

  • None

jeweils.

Sonstige Veralterungen#

  • backend_ps.get_bbox_header wird als internes Hilfsmittel betrachtet

  • BboxTransformToMaxOnly; wenn Sie sich darauf verlassen, erstellen Sie bitte eine Kopie des Codes.

  • ContourLabeler.add_label_clabeltext

  • TransformNode.is_bbox; stattdessen prüfen Sie das Objekt mit isinstance(..., BboxBase).

  • GridHelperCurveLinear.get_tick_iterator

Entfernungen#

Top-Level-Funktionen zur Registrierung und zum Zugriff auf Colormaps in mpl.cm#

Im Rahmen der mehrstufigen Refaktorierung der Colormap-Registrierung wurden die folgenden Funktionen entfernt:

Die Funktion matplotlib.pyplot.get_cmap bleibt aus Kompatibilitätsgründen erhalten.

Konturlinienbeschriftungen#

contour.ClabelText und ContourLabeler.set_label_props wurden entfernt. Verwenden Sie Text(..., transform_rotates_text=True) als Ersatz für contour.ClabelText(...) und text.set(text=text, color=color, fontproperties=labeler.labelFontProps, clip_box=labeler.axes.bbox) als Ersatz für ContourLabeler.set_label_props(label, text, color).

Die Attribute labelFontProps, labelFontSizeList und labelTextsList von ContourLabeler wurden entfernt. Verwenden Sie stattdessen das Attribut labelTexts und die Schriftarteigenschaften der entsprechenden Textobjekte.

num2julian, julian2num und JULIAN_OFFSET#

... des Moduls dates wurden ohne Ersatz entfernt. Diese waren undokumentiert und nicht exportiert.

Julianische Daten in Matplotlib wurden aus einer julianischen Datums-Epoche berechnet: jdate = (date - np.datetime64(EPOCH)) / np.timedelta64(1, 'D'). Umgekehrt wurde ein julianisches Datum als date = np.timedelta64(int(jdate * 24 * 3600), 's') + np.datetime64(EPOCH) in ein Datum konvertiert. Matplotlib verwendete EPOCH='-4713-11-24T12:00', sodass der 01.01.2000 um 12:00 Uhr 2_451_545.0 ist (siehe https://en.wikipedia.org/wiki/Julian_day).

offsetbox-Methoden#

offsetbox.bbox_artist wurde entfernt. Dies war nur ein Wrapper zum Aufruf von patches.bbox_artist, wenn ein Flag in der Datei gesetzt ist, verwenden Sie es also direkt, wenn Sie das Verhalten benötigen.

OffsetBox.get_extent_offsets und OffsetBox.get_extent wurden entfernt; diese Methoden sind auch bei allen Unterklassen von OffsetBox entfernt. Um die Extents des OffsetBox zu erhalten, verwenden Sie anstelle von get_extent OffsetBox.get_bbox, das direkt eine Bbox-Instanz zurückgibt. Um auch die Child-Offsets zu erhalten, rufen Sie anstelle von get_extent_offsets separat get_offset für jedes Kind auf, nachdem ein Zeichnen ausgelöst wurde.

parse_fontconfig_pattern löst bei unbekannten Konstantenamen Fehler aus#

Zuvor wurde bei einem Fontconfig-Pattern wie DejaVu Sans:foo der unbekannte Konstantename foo stillschweigend ignoriert. Dies löst nun einen Fehler aus.

tri-Untermodule#

Die Untermodule matplotlib.tri.* wurden entfernt. Die gesamte Funktionalität ist direkt in matplotlib.tri verfügbar und sollte von dort importiert werden.

Widget-API#

  • CheckButtons.rectangles und CheckButtons.lines wurden entfernt; CheckButtons zeichnet sich nun selbst mit scatter.

  • RadioButtons.circles wurde entfernt; RadioButtons zeichnet sich nun selbst mit scatter.

  • MultiCursor.needclear wurde ohne Ersatz entfernt.

  • Der ungenutzte Parameter x für TextBox.begin_typing war ein erforderliches Argument und wurde nun entfernt.

Die meisten Argumente für Widgets wurden zu schlüsselwortbasierten Argumenten#

Die Übergabe aller bis auf die allerersten Argumente positionsbezogen in den Konstruktoren von Widgets ist nun schlüsselwortbasiert. Im Allgemeinen sind alle optionalen Argumente schlüsselwortbasiert.

API von Axes3D#

  • Axes3D.unit_cube, Axes3D.tunit_cube und Axes3D.tunit_edges wurden ohne Ersatz entfernt.

  • axes3d.vvec, axes3d.eye, axes3d.sx und axes3d.sy wurden ohne Ersatz entfernt.

Inkonsistente nth_coord und loc übergeben an _FixedAxisArtistHelperBase#

Der Wert des Parameters nth_coord von _FixedAxisArtistHelperBase und seinen Unterklassen wird nun aus dem Wert von loc abgeleitet; die Übergabe inkonsistenter Werte (z.B. Anfordern einer "oberen y-Achse" oder einer "linken x-Achse") hat keine Auswirkung mehr.

Übergabe von undefiniertem label_mode an Grid#

... ist nicht mehr erlaubt. Dies schließt mpl_toolkits.axes_grid1.axes_grid.Grid, mpl_toolkits.axes_grid1.axes_grid.AxesGrid und mpl_toolkits.axes_grid1.axes_grid.ImageGrid ein, sowie die entsprechenden Klassen, die aus mpl_toolkits.axisartist.axes_grid importiert wurden.

Übergeben Sie stattdessen label_mode='keep', um das vorherige Verhalten beizubehalten, dass Labels nicht modifiziert werden.

draw_gouraud_triangle#

... wird entfernt. Verwenden Sie stattdessen draw_gouraud_triangles.

Ein draw_gouraud_triangle-Aufruf in einem benutzerdefinierten Artist kann einfach ersetzt werden als

self.draw_gouraud_triangles(gc, points.reshape((1, 3, 2)),
                            colors.reshape((1, 3, 4)), trans)

Eine draw_gouraud_triangles-Methode kann aus einer vorhandenen draw_gouraud_triangle-Methode implementiert werden als

transform = transform.frozen()
for tri, col in zip(triangles_array, colors_array):
    self.draw_gouraud_triangle(gc, tri, col, transform)

Sonstige Entfernungen#

Die folgenden Elemente wurden zuvor ersetzt und sind nun entfernt

  • Der Parameter ticklabels von matplotlib.axis.Axis.set_ticklabels wurde in labels umbenannt.

  • Barbs.barbs_doc und Quiver.quiver_doc werden entfernt. Dies sind die Docstrings und sollten nicht als benanntes Klassenmitglied zugänglich sein, sondern wie normale Docstrings.

  • collections.PolyCollection.span_where und collections.BrokenBarHCollection; verwenden Sie stattdessen fill_between.

  • Legend.legendHandles war undokumentiert und wurde in legend_handles umbenannt.

Die folgenden Elemente wurden ohne Ersatz entfernt

  • Die Attribute repeat von TimedAnimation und Unterklassen sowie save_count von FuncAnimation gelten als privat und wurden entfernt.

  • matplotlib.backend.backend_agg.BufferRegion.to_string

  • matplotlib.backend.backend_agg.BufferRegion.to_string_argb

  • matplotlib.backends.backend_ps.PsBackendHelper

  • matplotlib.backends.backend_webagg.ServerThread

  • Der Parameter raw von GridSpecBase.get_grid_positions

  • matplotlib.patches.ConnectionStyle._Base.SimpleEvent

  • passthru_pt Attribut von mpl_toolkits.axisartist.AxisArtistHelper

Entwicklungsänderungen#

Build-System auf Meson umgestellt#

Das Build-System von Matplotlib wurde von setuptools auf meson-python und Meson portiert. Folglich gab es einige Änderungen für Entwicklungs- und Verpackungszwecke.

  1. Die Installation von Paketen mit pyproject.toml per pip verwendet standardmäßig Build-Isolation, was mit der bearbeitbaren Installation interferiert. Daher ist es für Entwickler, die bearbeitbare Installationen verwenden, nun notwendig, das Flag --no-build-isolation an pip install zu übergeben. Das bedeutet, dass alle Build-Abhängigkeiten in der Umgebung für eine bearbeitbare Installation verfügbar sein müssen.

  2. Die Build-Konfiguration wurde von einer benutzerdefinierten mplsetup.cfg (auch konfigurierbar über die Umgebungsvariable MPLSETUP) auf Meson-Optionen verlagert. Diese können über Meson-Pythons Build-Konfigurationseinstellungen für setup-args spezifiziert werden. Sehen Sie sich meson_options.txt für alle Optionen an. Zum Beispiel kann eine mplsetup.cfg, die Folgendes enthält:

    [rc_options]
    backend=Agg
    
    [libs]
    system_qhull = True
    

    kann durch Übergabe der folgenden Argumente an pip ersetzt werden

    --config-settings=setup-args="-DrcParams-backend=Agg"
    --config-settings=setup-args="-Dsystem-qhull=true"
    

    Beachten Sie, dass Sie pip >= 23.1 verwenden müssen, um mehr als eine Einstellung übergeben zu können.

  3. In ähnlicher Weise werden nun Mesons eingebaute Optionen anstelle von benutzerdefinierten Optionen verwendet, z. B. ist die LTO-Option nun b_lto.

  4. Unter Windows aktiviert Meson automatisch eine Visual Studio-Umgebung. Dies geschieht jedoch nicht, wenn ein anderer Compiler verfügbar ist. Sehen Sie sich die Dokumentation von Meson an, wenn Sie die Priorität der gewählten Compiler ändern möchten.

  5. Die Installation von Testdaten wurde zuvor durch mplsetup.cfg gesteuert, wurde aber nun auf Mesons Installationstags verlagert. Um Testdaten zu installieren, fügen Sie das Tag tests zur angeforderten Installation hinzu (stellen Sie sicher, dass Sie die vorhandenen Tags wie unten angegeben einschließen)

    --config-settings=install-args="--tags=data,python-runtime,runtime,tests"
    
  6. Die Überprüfung von Typisierungshinweisen mit stubtest funktioniert bei bearbeitbaren Installationen nicht einfach. Vorerst empfehlen wir eine normale (nicht bearbeitbare) Installation, wenn Sie stubtest ausführen möchten.

Erhöhung der minimal unterstützten Versionen von Abhängigkeiten.

Für Matplotlib 3.9 werden die minimal unterstützten Versionen angehoben

Abhängigkeit

min in mpl3.8

min in mpl3.9

NumPy

1.21.0

1.23.0

setuptools

42

64

Dies entspricht unserer Richtlinie für Mindestabhängigkeiten und SPEC 0.

Um die Anforderungen von setuptools_scm zu erfüllen, wurde die Mindestversion von setuptools von 42 auf 64 erhöht.

Erweiterungen erfordern C++17#

Matplotlib benötigt nun einen Compiler, der C++17 unterstützt, um seine Erweiterungen zu kompilieren. Laut Scipy-Analyse sollte dies auf allen unterstützten Plattformen verfügbar sein.

Unterstützung für Windows auf ARM64#

Windows auf ARM64 bündelt nun FreeType 2.6.1 anstelle von 2.11.1 beim Kompilieren aus dem Quellcode. Dies kann zu kleinen Änderungen bei der Textdarstellung führen, sollte aber mit allen anderen Plattformen konsistent sein.