Neues in Matplotlib 3.3.0 (16. Juli 2020)#

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 Achsen#

Vorläufige API zum Erstellen semantischer Achsenlayouts aus Text oder verschachtelten Listen#

Die Klasse Figure verfügt über eine vorläufige Methode zur Erzeugung komplexer Gitter benannter axes.Axes basierend auf verschachtelten Listen oder ASCII-Art

axd = plt.figure(constrained_layout=True).subplot_mosaic(
    [['.', 'histx'],
     ['histy', 'scat']]
)
for k, ax in axd.items():
    ax.text(0.5, 0.5, k,
            ha='center', va='center', fontsize=36,
            color='darkgrey')

(Quellcode, 2x.png, png)

oder als Zeichenkette (mit einbuchstabigen Achsenbeschriftungen)

axd = plt.figure(constrained_layout=True).subplot_mosaic(
    """
    TTE
    L.E
    """)
for k, ax in axd.items():
    ax.text(0.5, 0.5, k,
            ha='center', va='center', fontsize=36,
            color='darkgrey')

(Quellcode, 2x.png, png)

Weitere Details und Beispiele finden Sie unter Komplexe und semantische Figurenzusammensetzung (subplot_mosaic).

GridSpec.subplots()#

Die Klasse GridSpec hat eine Methode subplots erhalten, sodass man schreiben kann

fig.add_gridspec(2, 2, height_ratios=[3, 1]).subplots()

als Alternative zu

fig.subplots(2, 2, gridspec_kw={"height_ratios": [3, 1]})

Neue Methoden Axes.sharex, Axes.sharey#

Diese neuen Methoden erlauben das Teilen von Achsen sofort nach deren Erstellung. Beachten Sie, dass das Verhalten unbestimmt ist, wenn Achsen nicht sofort nach der Erstellung geteilt werden.

Sie können beispielsweise verwendet werden, um selektiv einige Achsen zu verknüpfen, die alle zusammen mit subplot_mosaic erstellt wurden

fig = plt.figure(constrained_layout=True)
axd = fig.subplot_mosaic([['.', 'histx'], ['histy', 'scat']],
                         gridspec_kw={'width_ratios': [1, 7],
                                      'height_ratios': [2, 7]})

axd['histx'].sharex(axd['scat'])
axd['histy'].sharey(axd['scat'])

(Quellcode, 2x.png, png)

tight_layout unterstützt jetzt suptitle#

Frühere Versionen berücksichtigten Figure.suptitle nicht, sodass es nach dem Aufruf von tight_layout mit anderen Elementen überlappen konnte

(Quellcode, 2x.png, png)

Von nun an wird die suptitle berücksichtigt

(Quellcode, 2x.png, png)

Festlegen des Seitenverhältnisses von Achsen#

Es ist jetzt möglich, das Seitenverhältnis einer Achsenbox direkt über set_box_aspect festzulegen. Das Seitenverhältnis der Box ist das Verhältnis zwischen Achsenhöhe und Achsenbreite in physikalischen Einheiten, unabhängig von den Datenlimits. Dies ist nützlich, um z. B. ein quadratisches Diagramm zu erstellen, unabhängig von den darin enthaltenen Daten, oder um ein Nicht-Bilddiagramm mit denselben Achsendimensionen neben einem Bilddiagramm mit festem (Daten-)Seitenverhältnis zu haben.

Anwendungsfälle finden Sie im Beispiel Achsen-Box-Seitenverhältnis.

Farben und Colormaps#

Turbo-Colormap#

Turbo ist eine verbesserte Regenbogen-Colormap für die Visualisierung, die vom Google AI-Team für Computer Vision und maschinelles Lernen entwickelt wurde. Ihr Zweck ist die Darstellung von Tiefen- und Disparitätsdaten. Weitere Details finden Sie im Google AI Blog.

(Quellcode, 2x.png, png)

colors.BoundaryNorm unterstützt das Schlüsselwortargument extend#

BoundaryNorm verfügt jetzt über ein Schlüsselwortargument extend, analog zu extend in contourf. Wenn es auf 'both', 'min' oder 'max' gesetzt ist, ordnet es die entsprechenden Werte außerhalb des Bereichs den Nachschlagetabellennummern der Colormap in der Nähe der entsprechenden Enden ihres Bereichs zu, sodass die Farben für Werte außerhalb des Bereichs neben ihren Nachbarn innerhalb des Bereichs liegen, aber von ihnen unterscheidbar sind. Die Farbleiste erbt das Argument extend von der Norm, sodass mit extend='both' beispielsweise die Farbleiste dreieckige Erweiterungen für Werte außerhalb des Bereichs mit Farben aufweist, die sich von den benachbarten Farben innerhalb des Bereichs unterscheiden.

(Quellcode, 2x.png, png)

Textfarbe für Legendenbeschriftungen#

Die Textfarbe von Legendenbeschriftungen kann jetzt durch Übergabe eines Parameters labelcolor an legend gesetzt werden. Das Schlüsselwort labelcolor kann sein

  • Eine einzelne Farbe (entweder eine Zeichenkette oder ein RGBA-Tupel), die die Textfarbe aller Beschriftungen anpasst.

  • Eine Liste oder ein Tupel, wodurch die Textfarbe jeder Beschriftung individuell gesetzt werden kann.

  • linecolor, die die Textfarbe jeder Beschriftung auf die entsprechende Linienfarbe setzt.

  • markerfacecolor, die die Textfarbe jeder Beschriftung auf die entsprechende Marker-Flächenfarbe setzt.

  • markeredgecolor, die die Textfarbe jeder Beschriftung auf die entsprechende Marker-Randfarbe setzt.

(Quellcode, 2x.png, png)

Pcolor und Pcolormesh akzeptieren jetzt shading='nearest' und 'auto'#

Zuvor behandelten axes.Axes.pcolor und axes.Axes.pcolormesh die Situation, in der x und y die gleiche (jeweilige) Größe wie C haben, indem sie die letzte Zeile und Spalte von C verwerfen, und x und y als die Kanten der verbleibenden Zeilen und Spalten in C betrachtet werden. Viele Benutzer möchten jedoch, dass x und y auf den Zeilen und Spalten von C zentriert sind.

Um dies zu ermöglichen, sind shading='nearest' und shading='auto' neue erlaubte Zeichenketten für das Schlüsselwortargument shading. 'nearest' zentriert die Farbe auf x und y, wenn x und y die gleichen Dimensionen wie C haben (andernfalls wird ein Fehler ausgelöst). shading='auto' wählt 'flat' oder 'nearest' basierend auf der Größe von X, Y, C.

Wenn shading='flat' dann sollten X und Y Dimensionen haben, die um eins größer sind als C. Wenn X und Y die gleichen Dimensionen wie C haben, wird das frühere Verhalten verwendet und die letzte Zeile und Spalte von C verworfen, und eine DeprecationWarning wird ausgegeben.

Benutzer können dies auch über die neue rcParams["pcolor.shading"] (Standard: 'auto') in ihrer .matplotlibrc oder über rcParams festlegen.

Beispiele finden Sie unter pcolormesh.

Titel, Ticks und Beschriftungen#

Beschriftungen an Achsenkanten ausrichten#

set_xlabel, set_ylabel und ColorbarBase.set_label unterstützen einen Parameter loc für vereinfachte Positionierung. Für die x-Achsenbeschriftung sind die unterstützten Werte 'left', 'center' oder 'right'. Für die y-Achsenbeschriftung sind die unterstützten Werte 'bottom', 'center' oder 'top'.

Der Standard wird über rcParams["xaxis.labellocation"] (Standard: 'center') und rcParams["yaxis.labellocation"] (Standard: 'center') gesteuert; die Farbleistenbeschriftung verwendet die rcParam basierend auf ihrer Ausrichtung.

(Quellcode)

(2x.png, png)

(2x.png, png)

Tick-Formatierer können jetzt mit Zeichenketten oder Funktionsargumenten gesetzt werden#

set_major_formatter und set_minor_formatter akzeptieren jetzt str- oder Funktionsargumente zusätzlich zu Formatter-Instanzen. Für eine str wird automatisch ein StrMethodFormatter generiert und verwendet. Für eine Funktion wird automatisch ein FuncFormatter generiert und verwendet. Anders ausgedrückt,

ax.xaxis.set_major_formatter('{x} km')
ax.xaxis.set_minor_formatter(lambda x, pos: str(x-5))

sind Kurzschlüsse für

import matplotlib.ticker as mticker

ax.xaxis.set_major_formatter(mticker.StrMethodFormatter('{x} km'))
ax.xaxis.set_minor_formatter(
    mticker.FuncFormatter(lambda x, pos: str(x-5))

(Quellcode, 2x.png, png)

Axes.set_title erhält ein Schlüsselwortargument y zur Steuerung der automatischen Positionierung#

set_title versucht, den Titel automatisch zu positionieren, um Dekoratoren auf der oberen x-Achse zu vermeiden. Dies ist nicht immer wünschenswert, daher ist y jetzt ein explizites Schlüsselwortargument von set_title. Es hat den Standardwert None, was bedeutet, dass die automatische Positionierung verwendet wird. Wenn ein Wert angegeben wird (d. h. der Standard vor 3.0 war y=1.0), wird die automatische Positionierung deaktiviert. Dies kann auch über den neuen rcParameter rcParams["axes.titley"] (Standard: None) gesetzt werden.

(Quellcode, 2x.png, png)

Offset-Text wird jetzt oben gesetzt, wenn axis.tick_top() verwendet wird#

Behebt das Problem, dass die Potenzanzeige (z. B. 1e4) unten blieb, auch wenn die Ticks oben waren.

Z-Reihenfolge von Konturbeschriftungen festlegen#

clabel akzeptiert jetzt ein Schlüsselwortargument zorder, was die Festlegung der zorder von Konturbeschriftungen erleichtert. Wenn nicht angegeben, war die Standard-zorder von clabels immer 3 (d. h. die Standard-zorder von Text) unabhängig von der zorder, die an contour/contourf übergeben wurde. Die neue Standard-zorder für clabels wurde auf (2 + zorder, die an contour / contourf übergeben wurde) geändert.

Weitere Änderungen#

Neue Methode Axes.axline#

Eine neue Methode axline wurde hinzugefügt, um unendlich lange Linien zu zeichnen, die durch zwei Punkte verlaufen.

fig, ax = plt.subplots()

ax.axline((.1, .1), slope=5, color='C0', label='by slope')
ax.axline((.1, .2), (.8, .7), color='C3', label='by points')

ax.legend()

(Quellcode, 2x.png, png)

imshow wandelt jetzt 3D-Arrays mit Tiefe 1 in 2D um

Ab dieser Version werden Arrays der Größe MxNx1 in MxN umgewandelt, um sie anzuzeigen. Das bedeutet, dass Befehle wie plt.imshow(np.random.rand(3, 3, 1)) keine Fehlermeldung mehr zurückgeben, dass die Bildform ungültig ist.

Bessere Kontrolle über die Normalisierung von Axes.pie#

Zuvor normalisierte Axes.pie ihre Eingabe x, wenn sum(x) > 1 war, tat aber nichts, wenn die Summe kleiner als 1 war. Dies kann verwirrend sein, daher wurde ein explizites Schlüsselwortargument normalize hinzugefügt. Standardmäßig bleibt das alte Verhalten erhalten.

Durch die Übergabe von normalize kann explizit gesteuert werden, ob eine Neuskalierung stattfindet oder ob partielle Tortendiagramme erstellt werden sollen. Wenn die Normalisierung deaktiviert ist und sum(x) > 1, wird ein Fehler ausgelöst.

(Quellcode, 2x.png, png)

Daten verwenden eine moderne Epoche#

Matplotlib konvertiert Daten in Tage seit einer Epoche unter Verwendung von dates.date2num (über matplotlib.units). Zuvor wurde eine Epoche von 0000-12-31T00:00:00 verwendet, sodass 0001-01-01 in 1,0 konvertiert wurde. Eine so weit in der Vergangenheit liegende Epoche bedeutete, dass ein modernes Datum Mikrosekunden nicht speichern konnte, da 2000 Jahre mal der 2^(-52) Auflösung eines 64-Bit-Floats 14 Mikrosekunden ergeben.

Hier ändern wir die Standardepoche zur vernünftigeren UNIX-Standardeinstellung von 1970-01-01T00:00:00, was für ein modernes Datum eine Auflösung von 0,35 Mikrosekunden hat. (Eine feinere Auflösung ist nicht möglich, da wir uns für die Datums-Locators auf datetime.datetime verlassen). Der Zugriff auf die Epoche wird über get_epoch bereitgestellt, und es gibt einen neuen rcParam rcParams["date.epoch"] (Standard: '1970-01-01T00:00:00'). Der Benutzer kann auch set_epoch aufrufen, muss diese aber *vor* jeder Datums-Konvertierung oder Plotterstellung setzen.

Wenn Sie Daten haben, die als ordinale Floats in der alten Epoche gespeichert sind, können Sie diese mit der folgenden Formel in die neue ordinale Darstellung konvertieren

new_ordinal = old_ordinal + mdates.date2num(np.datetime64('0000-12-31'))

Linien akzeptieren jetzt MarkerStyle Instanzen als Eingabe#

Ähnlich wie scatter akzeptieren plot und Line2D jetzt MarkerStyle Instanzen als Eingabe für den Parameter marker.

plt.plot(..., marker=matplotlib.markers.MarkerStyle("D"))

Schriftarten#

Einfache Syntax zur Auswahl von Schriftarten nach absolutem Pfad#

Schriftarten können nun durch Übergabe eines absoluten pathlib.Path an das Schlüsselwortargument font von Text ausgewählt werden.

Verbesserte Erkennung von Schriftartengewichten#

Matplotlib ist nun besser in der Lage, das Gewicht von Schriftarten aus ihren Metadaten zu ermitteln, wodurch Schriftarten innerhalb derselben Familie genauer unterschieden werden können.

Verbesserungen bei rcParams#

matplotlib.rc_context kann als Decorator verwendet werden#

matplotlib.rc_context kann nun als Decorator verwendet werden (technisch gesehen ist es jetzt als contextlib.contextmanager implementiert), z. B.:

@rc_context({"lines.linewidth": 2})
def some_function(...):
    ...

rcParams zur Steuerung des Standardverhaltens beim "Fenster hervorheben"#

Die neue Konfigurationsoption rcParams["figure.raise_window"] (Standard: True) ermöglicht das Deaktivieren des Hervorhebens des Plot-Fensters beim Aufruf von show oder pause. Das Backend MacOSX wird derzeit nicht unterstützt.

Verallgemeinertes mathtext.fallback zu rcParams hinzugefügt#

Neuer rcParam rcParams["mathtext.fallback"] (Standard: 'cm'). Akzeptiert "cm", "stix", "stixsans" oder "none" zum Ausschalten des Fallbacks. Der rcParam mathtext.fallback_to_cm ist veraltet, überschreibt aber bei Verwendung das neue Fallback.

contour.linewidth zu rcParams hinzugefügt#

Die neue Konfigurationsoption rcParams["contour.linewidth"] (Standard: None) ermöglicht die Steuerung der Standard-Linienbreite von Konturen als Float. Wenn auf None gesetzt, fällt die Linienbreite auf rcParams["lines.linewidth"] (Standard: 1.5). Der Konfigurationswert wird wie üblich durch das linewidths-Argument überschrieben, das an contour übergeben wird, wenn es nicht auf None gesetzt ist.

Verbesserungen bei 3D-Achsen#

Axes3D verzerrt das 3D-Plot nicht mehr, um das 2D-Seitenverhältnis anzupassen#

Plots, die mit Axes3D erstellt wurden, wurden zuvor gestreckt, um in ein quadratisches Begrenzungsfeld zu passen. Da diese Streckung nach der Projektion von 3D auf 2D erfolgte, führte sie zu verzerrten Bildern, wenn nicht-quadratische Begrenzungsfelder verwendet wurden. Seit Version 3.3 tritt dies nicht mehr auf.

Derzeit werden Modi zum Einstellen des Seitenverhältnisses (über set_aspect) im Datenraum für Axes3D nicht unterstützt, könnten aber in Zukunft unterstützt werden. Wenn Sie ein gleiches Seitenverhältnis im Datenraum simulieren möchten, stellen Sie das Verhältnis Ihrer Datenlimits so ein, dass es dem Wert von get_box_aspect entspricht. Um diese Verhältnisse zu steuern, verwenden Sie die Methode set_box_aspect, die die Verhältnisse als 3er-Tupel von X:Y:Z akzeptiert. Das Standardseitenverhältnis ist 4:4:3.

3D-Achsen unterstützen jetzt kleine Ticks#

ax = plt.figure().add_subplot(projection='3d')

ax.scatter([0, 1, 2], [1, 3, 5], [30, 50, 70])

ax.set_xticks([0.25, 0.75, 1.25, 1.75], minor=True)
ax.set_xticklabels(['a', 'b', 'c', 'd'], minor=True)

ax.set_yticks([1.5, 2.5, 3.5, 4.5], minor=True)
ax.set_yticklabels(['A', 'B', 'C', 'D'], minor=True)

ax.set_zticks([35, 45, 55, 65], minor=True)
ax.set_zticklabels([r'$\alpha$', r'$\beta$', r'$\delta$', r'$\gamma$'],
                   minor=True)

ax.tick_params(which='major', color='C0', labelcolor='C0', width=5)
ax.tick_params(which='minor', color='C1', labelcolor='C1', width=3)

(Quellcode, 2x.png, png)

Home/Vorwärts/Rückwärts-Buttons funktionieren jetzt mit 3D-Achsen#

Verbesserungen am interaktiven Werkzeug#

Konsistenteres Verhalten der Werkzeugleiste über Backends hinweg#

Werkzeugleistenfunktionen sind nun über Backends hinweg konsistenter. Die Verlaufsschaltflächen werden automatisch deaktiviert, wenn keine weitere Aktion in eine Richtung möglich ist. Die Schwenk- und Zoomschaltflächen werden als aktiv markiert, wenn sie verwendet werden.

In NbAgg und WebAgg verwenden die Werkzeugleistenschaltflächen nun die gleichen Symbole wie andere Backends. Die WebAgg-Werkzeugleiste verwendet nun dieselben Symbole wie andere Backends.

Werkzeugleistensymbole sind nun für dunkle Themes gestaltet#

Bei dunklen Themes werden die Werkzeugleistensymbole nun invertiert. Bei Verwendung des GTK3Agg-Backends sind die Werkzeugleistensymbole nun symbolisch, und sowohl Vorder- als auch Hintergrundfarben folgen dem Theme. Tooltips sollten ebenfalls korrekt funktionieren.

Cursor-Text verwendet nun eine Anzahl von signifikanten Ziffern, die der Zeigepräzision entsprechen#

Zuvor enthielt die von der Cursor-Textanzeige angezeigte X/Y-Position normalerweise weit mehr signifikante Ziffern als die Zeigepräzision der Maus (typischerweise ein Pixel). Dies wurde nun für lineare Skalen behoben.

GTK / Qt Zoom-Rechteck jetzt schwarz-weiß#

Dies macht es auch über einem dunklen Hintergrund sichtbar.

Vereinfachungen bei Ereignishandlern#

Die Ereignishandler backend_bases.key_press_handler und backend_bases.button_press_handler können nun direkt mit einem Canvas verbunden werden mit canvas.mpl_connect("key_press_event", key_press_handler) und canvas.mpl_connect("button_press_event", button_press_handler), anstatt Wrapper-Funktionen schreiben zu müssen, die die (nun optionalen) Parameter canvas und toolbar ausfüllen.

Funktionen zur Berechnung der Größe eines Pfades#

Verschiedene Funktionen wurden zu BezierSegment und Path hinzugefügt, um die Berechnung der Form/Größe eines Path und seiner zusammengesetzten Bézier-Kurven zu ermöglichen.

Zusätzlich zu den unten aufgeführten Korrekturen hat BezierSegment mehr Dokumentation und Benutzerfreundlichkeitsverbesserungen erhalten, einschließlich Eigenschaften, die seine Dimension, seinen Grad, seine Kontrollpunkte und mehr enthalten.

Bessere Schnittstelle für die Pfadsegment-Iteration#

iter_bezier iteriert durch die BezierSegment, aus denen der Pfad besteht. Dies ist in der Regel weitaus nützlicher als die bestehende Funktion iter_segments, die die absolut minimale Information liefert, die zur Rekonstruktion des Pfades erforderlich ist.

Fehler behoben, der die BBox eines Pfades falsch berechnete#

Historisch gesehen hat get_extents immer einfach die BBox der Kontrollpunkte einer Kurve zurückgegeben, anstatt die BBox der Kurve selbst. Dies ist zwar eine korrekte Obergrenze für die Ausdehnungen des Pfades, kann aber für nicht-lineare Bézier-Kurven dramatisch von den tatsächlichen Ausdehnungen des Pfades abweichen.

Backend-spezifische Verbesserungen#

savefig() hat ein backend Schlüsselwortargument erhalten#

Das Schlüsselwortargument backend für savefig kann nun verwendet werden, um das Rendering-Backend auszuwählen, ohne das Backend global setzen zu müssen; z. B. kann man PDFs mit dem pgf-Backend speichern mit savefig("file.pdf", backend="pgf").

Das SVG-Backend kann nun Schraffuren mit Transparenz rendern#

Das SVG-Backend respektiert nun die Alpha-Transparenz des Schraffur-Strichs. Nützliche Anwendungen sind unter anderem semi-transparente Schraffuren als subtile Möglichkeit, Spalten in Balkendiagrammen zu unterscheiden.

SVG unterstützt URLs für mehr Künstler#

URLs für mehr Künstler (d. h. von Artist.set_url) werden nun in SVG-Dateien gespeichert, nämlich Ticks und Line2Ds werden nun unterstützt.

Bilder in SVG werden in einigen Viewern nicht mehr unscharf dargestellt#

Für Bilder ohne Interpolation (imshow(..., interpolation='none') wird nun ein Stil bereitgestellt, sodass SVG-Bildbetrachter bei der eigenen Darstellung keine Interpolation mehr durchführen.

Speichern von SVG unterstützt nun das Hinzufügen von Metadaten#

Beim Speichern von SVG-Dateien können nun Metadaten übergeben werden, die in der Datei unter Verwendung von Dublin Core und RDF gespeichert werden. Eine Liste gültiger Metadaten finden Sie in der Dokumentation für FigureCanvasSVG.print_svg.

Speichern von PDF-Metadaten über PGF jetzt konsistent mit PDF-Backend#

Beim Speichern von PDF-Dateien mit dem PGF-Backend werden übergebene Metadaten auf die gleiche Weise interpretiert wie beim PDF-Backend. Zuvor wurden diese Metadaten vom PGF-Backend nur beim Speichern einer mehrseitigen PDF mit backend_pgf.PdfPages akzeptiert, sind aber nun auch beim Speichern einer einzelnen Abbildung zulässig.

NbAgg und WebAgg verwenden nicht mehr jQuery & jQuery UI#

Stattdessen sind sie mit reinem JavaScript implementiert. Bitte melden Sie etwaige Probleme mit Browsern.