Was gibt es Neues in Matplotlib 3.7.0 (13. Februar 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).

Verbesserungen bei Plots und Annotationen#

hatch Parameter für Tortendiagramme#

pie akzeptiert nun einen hatch Schlüsselwort, der eine Hatch- oder Liste von Hatches als Eingabe nimmt

fig, (ax1, ax2) = plt.subplots(ncols=2)
x = [10, 30, 60]

ax1.pie(x, hatch=['.', 'o', 'O'])
ax2.pie(x, hatch='.O')

ax1.set_title("hatch=['.', 'o', 'O']")
ax2.set_title("hatch='.O'")

(Quellcode, 2x.png, png)

Two pie charts, identified as ax1 and ax2, both have a small blue slice, a medium orange slice, and a large green slice. ax1 has a dot hatching on the small slice, a small open circle hatching on the medium slice, and a large open circle hatching on the large slice. ax2 has the same large open circle with a dot hatch on every slice.

Fehler im Polarkoordinatendiagramm werden in Polarkoordinaten gezeichnet#

Kappen und Fehlerlinien werden nun relativ zu Polarkoordinaten gezeichnet, wenn Fehlerbalken in Polarkoordinatendiagrammen geplottet werden.

../../_images/sphx_glr_polar_error_caps_001.png

Zusätzliche Formatierungsoptionen für Zeichenketten in bar_label#

Das `fmt`-Argument von bar_label akzeptiert nun Formatierungszeichenketten im {}Stil

import matplotlib.pyplot as plt

fruit_names = ['Coffee', 'Salted Caramel', 'Pistachio']
fruit_counts = [4000, 2000, 7000]

fig, ax = plt.subplots()
bar_container = ax.bar(fruit_names, fruit_counts)
ax.set(ylabel='pints sold', title='Gelato sales by flavor', ylim=(0, 8000))
ax.bar_label(bar_container, fmt='{:,.0f}')

(Quellcode, 2x.png, png)

Es akzeptiert auch aufrufbare Funktionen

animal_names = ['Lion', 'Gazelle', 'Cheetah']
mph_speed = [50, 60, 75]

fig, ax = plt.subplots()
bar_container = ax.bar(animal_names, mph_speed)
ax.set(ylabel='speed in MPH', title='Running speeds', ylim=(0, 80))
ax.bar_label(
    bar_container, fmt=lambda x: '{:.1f} km/h'.format(x * 1.61)
)

(Quellcode, 2x.png, png)

ellipse Box-Stil-Option für Annotationen#

Die Option `'ellipse'` für `boxstyle` kann nun verwendet werden, um Annotationen mit einer elliptischen Umrandung zu erstellen. Sie kann als geschlossene Kurvenform für längere Texte verwendet werden, anstelle des `boxstyle` `'circle'`, der ziemlich groß werden kann.

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5, 5))
t = ax.text(0.5, 0.5, "elliptical box",
        ha="center", size=15,
        bbox=dict(boxstyle="ellipse,pad=0.3"))

(Quellcode, 2x.png, png)

Die extent von imshow kann nun mit Einheiten ausgedrückt werden#

Der Parameter extent von imshow und set_extent kann nun mit Einheiten ausgedrückt werden.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(layout='constrained')
date_first = np.datetime64('2020-01-01', 'D')
date_last = np.datetime64('2020-01-11', 'D')

arr = [[i+j for i in range(10)] for j in range(10)]

ax.imshow(arr, origin='lower', extent=[0, 10, date_first, date_last])

plt.show()

(Quellcode, 2x.png, png)

Umgekehrte Reihenfolge der Legenden-Einträge#

Die Reihenfolge der Legenden-Einträge kann nun durch Übergabe von `reverse=True` an legend umgekehrt werden.

pcolormesh akzeptiert RGB(A)-Farben#

Die Methode pcolormesh kann nun explizit mit RGB(A)-Werten angegebene Farben verarbeiten. Um Farben anzugeben, muss das Array 3D mit der Form `(M, N, [3, 4])` sein.

import matplotlib.pyplot as plt
import numpy as np

colors = np.linspace(0, 1, 90).reshape((5, 6, 3))
plt.pcolormesh(colors)
plt.show()

(Quellcode, 2x.png, png)

Anzeige aktueller Erscheinungseinstellungen für Ticks, Tick-Beschriftungen und Gitterlinien#

Die neue Methode get_tick_params kann verwendet werden, um die Erscheinungseinstellungen abzurufen, die auf zusätzliche Ticks, Tick-Beschriftungen und Gitterlinien angewendet werden, die dem Plot hinzugefügt werden.

>>> import matplotlib.pyplot as plt

>>> fig, ax = plt.subplots()
>>> ax.yaxis.set_tick_params(labelsize=30, labelcolor='red',
...                          direction='out', which='major')
>>> ax.yaxis.get_tick_params(which='major')
{'direction': 'out',
'left': True,
'right': False,
'labelleft': True,
'labelright': False,
'gridOn': False,
'labelsize': 30,
'labelcolor': 'red'}
>>> ax.yaxis.get_tick_params(which='minor')
{'left': True,
'right': False,
'labelleft': True,
'labelright': False,
'gridOn': False}

Stil-Dateien können aus Drittanbieter-Paketen importiert werden#

Drittanbieter-Pakete können nun Stil-Dateien verteilen, die global wie folgt verfügbar sind. Angenommen, ein Paket ist als `import mypackage` importierbar, mit einem `mypackage/__init__.py` Modul. Dann kann ein `mypackage/presentation.mplstyle` Stylesheet als `plt.style.use("mypackage.presentation")` verwendet werden.

Die Implementierung importiert `mypackage` nicht tatsächlich, wodurch dieser Prozess sicher vor möglichen Import-Zeit-Nebeneffekten ist. Unterpakete (z.B. `dotted.package.name`) werden ebenfalls unterstützt.

Verbesserungen bei 3D-Plots#

Schaltflächen zum Verschieben und Zoomen von 3D-Plots#

Die Schaltflächen zum Verschieben und Zoomen in der Werkzeugleiste von 3D-Plots sind nun aktiviert. Deaktivieren Sie beide, um den Plot zu drehen. Wenn die Zoom-Schaltfläche gedrückt ist, zoomen Sie hinein, indem Sie mit der linken Maustaste eine Begrenzungsbox zeichnen, und hinaus, indem Sie mit der rechten Maustaste die Box zeichnen. Beim Zoomen eines 3D-Plots bleiben die aktuellen Ansichtsverhältnisse fixiert.

adjustable Schlüsselwort-Argument zum Einstellen gleicher Seitenverhältnisse in 3D#

Beim Einstellen gleicher Seitenverhältnisse für 3D-Plots können Benutzer wählen, ob sie die Datenlimits oder die Begrenzungsbox im Vergleich zu 2D-Axes modifizieren möchten.

import matplotlib.pyplot as plt
import numpy as np
from itertools import combinations, product

aspects = ('auto', 'equal', 'equalxy', 'equalyz', 'equalxz')
fig, axs = plt.subplots(1, len(aspects), subplot_kw={'projection': '3d'},
                        figsize=(12, 6))

# Draw rectangular cuboid with side lengths [4, 3, 5]
r = [0, 1]
scale = np.array([4, 3, 5])
pts = combinations(np.array(list(product(r, r, r))), 2)
for start, end in pts:
    if np.sum(np.abs(start - end)) == r[1] - r[0]:
        for ax in axs:
            ax.plot3D(*zip(start*scale, end*scale), color='C0')

# Set the aspect ratios
for i, ax in enumerate(axs):
    ax.set_aspect(aspects[i], adjustable='datalim')
    # Alternatively: ax.set_aspect(aspects[i], adjustable='box')
    # which will change the box aspect ratio instead of axis data limits.
    ax.set_title(f"set_aspect('{aspects[i]}')")

plt.show()

(Quellcode, 2x.png, png)

Poly3DCollection unterstützt Schattierung#

Es ist nun möglich, eine Poly3DCollection zu schattieren. Dies ist nützlich, wenn die Polygone z.B. aus einem 3D-Modell stammen.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

# Define 3D shape
block = np.array([
    [[1, 1, 0],
     [1, 0, 0],
     [0, 1, 0]],
    [[1, 1, 0],
     [1, 1, 1],
     [1, 0, 0]],
    [[1, 1, 0],
     [1, 1, 1],
     [0, 1, 0]],
    [[1, 0, 0],
     [1, 1, 1],
     [0, 1, 0]]
])

ax = plt.subplot(projection='3d')
pc = Poly3DCollection(block, facecolors='b', shade=True)
ax.add_collection(pc)
plt.show()

(Quellcode, 2x.png, png)

rcParam für die Farbe der 3D-Paneele#

Die rcParams rcParams["axes3d.xaxis.panecolor"] (Standard: `(0.95, 0.95, 0.95, 0.5)`), rcParams["axes3d.yaxis.panecolor"] (Standard: `(0.9, 0.9, 0.9, 0.5)`), rcParams["axes3d.zaxis.panecolor"] (Standard: `(0.925, 0.925, 0.925, 0.5)`) können verwendet werden, um die Farbe der Hintergrundpaneele in 3D-Plots zu ändern. Beachten Sie, dass es oft vorteilhaft ist, ihnen leicht unterschiedliche Schattierungen zu geben, um einen "3D-Effekt" zu erzielen und sie leicht transparent zu machen (Alpha < 1).

import matplotlib.pyplot as plt
with plt.rc_context({'axes3d.xaxis.panecolor': (0.9, 0.0, 0.0, 0.5),
                     'axes3d.yaxis.panecolor': (0.7, 0.0, 0.0, 0.5),
                     'axes3d.zaxis.panecolor': (0.8, 0.0, 0.0, 0.5)}):
    fig = plt.figure()
    fig.add_subplot(projection='3d')

(Quellcode, 2x.png, png)

Layout von Figure und Axes#

colorbar hat nun ein location Schlüsselwort-Argument#

Die Methode colorbar unterstützt nun ein location Schlüsselwort-Argument, um die Farbleiste einfacher zu positionieren. Dies ist nützlich, wenn eigene Einsetzachsen mit dem cax Schlüsselwort-Argument bereitgestellt werden und verhält sich ähnlich wie bei nicht bereitgestellten Achsen (wo das location Schlüsselwort weitergegeben wird). orientation und ticklocation sind nicht mehr erforderlich, da sie durch location bestimmt werden. ticklocation kann weiterhin angegeben werden, wenn die automatische Einstellung nicht bevorzugt wird. (orientation kann ebenfalls angegeben werden, muss aber mit dem location kompatibel sein.)

Ein Beispiel ist

import matplotlib.pyplot as plt
import numpy as np
rng = np.random.default_rng(19680801)
imdata = rng.random((10, 10))
fig, ax = plt.subplots(layout='constrained')
im = ax.imshow(imdata)
fig.colorbar(im, cax=ax.inset_axes([0, 1.05, 1, 0.05]),
             location='top')

(Quellcode, 2x.png, png)

Figuren-Legenden können mit constrained_layout außerhalb der Figuren platziert werden#

Constrained layout schafft Platz für Figuren-Legenden, wenn diese durch ein `loc`-Schlüsselwort-Argument angegeben werden, das mit dem String "outside" beginnt. Die Codes sind eindeutig von Achsen-Codes, da "outside upper right" Platz am oberen Rand der Figur für die Legende schafft, während "outside right upper" Platz auf der rechten Seite der Figur schafft. Details finden Sie im Legend-Leitfaden.

Pro-Subplot-Schlüsselwort-Argumente in subplot_mosaic#

Es ist nun möglich, Schlüsselwort-Argumente an die Axes-Erstellung in jedem spezifischen Aufruf von `add_subplot` in Figure.subplot_mosaic und pyplot.subplot_mosaic zu übergeben.

fig, axd = plt.subplot_mosaic(
    "AB;CD",
    per_subplot_kw={
        "A": {"projection": "polar"},
        ("C", "D"): {"xscale": "log"},
        "B": {"projection": "3d"},
    },
)

(Quellcode, 2x.png, png)

Dies ist besonders nützlich für die Erstellung von Mosaiken mit gemischten Projektionen, aber beliebige Schlüsselwort-Argumente können weitergegeben werden.

subplot_mosaic ist nicht mehr vorläufig#

Die API von Figure.subplot_mosaic und pyplot.subplot_mosaic gilt nun als stabil und wird gemäß Matplotlibs normalem Deprecationsprozess geändert.

Widget-Verbesserungen#

Benutzerdefiniertes Styling von Schaltflächen-Widgets#

Zusätzliches benutzerdefiniertes Styling von Schaltflächen-Widgets kann über die Argumente label_props und radio_props für RadioButtons und die Argumente label_props, frame_props und check_props für CheckButtons erreicht werden.

from matplotlib.widgets import CheckButtons, RadioButtons

fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(5, 2), width_ratios=[1, 2])
default_rb = RadioButtons(ax[0, 0], ['Apples', 'Oranges'])
styled_rb = RadioButtons(ax[0, 1], ['Apples', 'Oranges'],
                         label_props={'color': ['red', 'orange'],
                                      'fontsize': [16, 20]},
                         radio_props={'edgecolor': ['red', 'orange'],
                                      'facecolor': ['mistyrose', 'peachpuff']})

default_cb = CheckButtons(ax[1, 0], ['Apples', 'Oranges'],
                          actives=[True, True])
styled_cb = CheckButtons(ax[1, 1], ['Apples', 'Oranges'],
                         actives=[True, True],
                         label_props={'color': ['red', 'orange'],
                                      'fontsize': [16, 20]},
                         frame_props={'edgecolor': ['red', 'orange'],
                                      'facecolor': ['mistyrose', 'peachpuff']},
                         check_props={'color': ['darkred', 'darkorange']})

ax[0, 0].set_title('Default')
ax[0, 1].set_title('Stylized')

(Quellcode, 2x.png, png)

Blitting in Schaltflächen-Widgets#

Die Widgets Button, CheckButtons und RadioButtons unterstützen nun Blitting für schnellere Darstellung auf Backends, die dies unterstützen, indem `useblit=True` an den Konstruktor übergeben wird. Blitting ist auf unterstützten Backends standardmäßig aktiviert.

Weitere Verbesserungen#

Figuren-Hooks#

Die neue rcParams rcParams["figure.hooks"] (Standard: `[]`) bietet einen Mechanismus zur Registrierung beliebiger Anpassungen an pyplot-Figuren; es handelt sich um eine Liste von Strings im Format "dotted.module.name:dotted.callable.name", die Funktionen angeben, die für jede von pyplot.figure erstellte Figur aufgerufen werden; diese Funktionen können z.B. Rückruffunktionen anhängen oder die Werkzeugleiste ändern. Ein Beispiel für die Anpassung der Werkzeugleiste finden Sie unter mplcvd -- ein Beispiel für einen Figuren-Hook.

Neue & Verbesserte Narrative Dokumentation#