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'")
Fehler im Polarkoordinatendiagramm werden in Polarkoordinaten gezeichnet#
Kappen und Fehlerlinien werden nun relativ zu Polarkoordinaten gezeichnet, wenn Fehlerbalken in Polarkoordinatendiagrammen geplottet werden.
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}')
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)
)
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"))
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()
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()
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#
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()
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()
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')
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')
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"},
},
)
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#
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#
Brandneues Tutorial zu Animationen.
Neue Beispiele für gruppierte und gestapelte Balkendiagramme.
Neuer Abschnitt für neue Mitwirkende und neu organisierte Git-Anweisungen im Leitfaden für Mitwirkende.
Umstrukturierung des Tutorials zu Annotationen.