Was ist neu in Matplotlib 2.1.0 (7. Okt. 2017)#

Dokumentation#

Die Beispiele wurden migriert, um sphinx gallery zu verwenden. Dies ermöglicht eine bessere Vermischung von Text und Code in den Beispielen, bietet Links zum Herunterladen der Beispiele als Python-Skript und als Jupyter-Notebook und verbessert die Thumbnail-Galerien. Die Beispiele wurden in Tutorials und eine Galerie umorganisiert.

Viele Docstrings und Beispiele wurden verdeutlicht und verbessert.

Neue Funktionen#

String-kategorische Werte#

Alle Plot-Funktionen unterstützen nun string-kategorische Werte als Eingabe. Zum Beispiel:

data = {'apples': 10, 'oranges': 15, 'lemons': 5, 'limes': 20}
fig, ax = plt.subplots()
ax.bar(data.keys(), data.values(), color='lightgray')

(Quellcode, 2x.png, png)

Interaktive JS-Widgets für Animationen#

Jake Vanderplas' JSAnimation-Paket wurde in Matplotlib integriert. Dies fügt Matplotlib die HTMLWriter-Klasse hinzu, um eine JavaScript-HTML-Animation zu generieren, die für das IPython-Notebook geeignet ist. Dies kann standardmäßig aktiviert werden, indem der rc-Parameter animation.html auf jshtml gesetzt wird. Man kann auch die Methode to_jshtml aufrufen, um eine Animation manuell zu konvertieren. Dies kann mit der HTML-Anzeigeklasse von IPython angezeigt werden.

from IPython.display import HTML
HTML(animation.to_jshtml())

Die HTMLWriter-Klasse kann auch verwendet werden, um eine HTML-Datei zu generieren, indem der html-Writer angefordert wird.

Verbesserungen am Polarkoordinaten-Plot#

Die Polarkoordinaten-Achsen-Transformationen wurden stark überarbeitet, um eine bessere Anpassung der Ansichtsgrenzen und Tick-Beschriftungen zu ermöglichen. Zusätzliche Optionen für Ansichtsgrenzen ermöglichen die Erstellung eines Rings, eines Sektors oder einer Kombination aus beidem.

Die Methode set_rorigin() kann verwendet werden, um einen Offset zum minimalen Plot-Radius zu setzen und so einen Ring zu erzeugen.

Die Methode set_theta_zero_location() hat nun ein optionales Argument offset. Dieses Argument kann verwendet werden, um den Nullpunkt basierend auf dem angegebenen Ankerpunkt weiter zu spezifizieren.

../../_images/sphx_glr_polar_scatter_002.png

Polar Offset Demo#

Die Methoden set_thetamin() und set_thetamax() können verwendet werden, um den Bereich der geplotteten Winkel zu begrenzen und so Sektoren eines Kreises zu erzeugen.

../../_images/sphx_glr_polar_scatter_003.png

Polar Sector Demo#

Frühere Versionen erlaubten Plots mit negativen Radien, bei denen die negativen Werte einfach als Beschriftungen verwendet wurden und der tatsächliche Radius um das konfigurierte Minimum verschoben wurde. Diese Version erlaubt nun auch negative Radien für Gitter und Ticks, die zuvor stillschweigend ignoriert wurden.

Radiale Ticks wurden modifiziert, um parallel zur kreisförmigen Gitterlinie zu verlaufen, und Winkel-Ticks wurden modifiziert, um parallel zur Gitterlinie zu verlaufen. Es kann auch nützlich sein, Tick-Labels zu drehen, um sie an die Grenze anzupassen. Ein Aufruf von ax.tick_params(rotation='auto') aktiviert das neue Verhalten: radiale Tick-Labels werden parallel zur kreisförmigen Gitterlinie verlaufen, und Winkel-Tick-Labels werden senkrecht zur Gitterlinie verlaufen (d.h. parallel zur äußeren Grenze). Zusätzlich gehorchen Tick-Labels nun den Polsterungseinstellungen, die zuvor nur auf kartesischen Plots funktionierten. Folglich wird das Argument frac für PolarAxes.set_thetagrids nicht mehr angewendet. Die Tick-Polsterung kann mit dem Argument pad für Axes.tick_params oder Axis.set_tick_params modifiziert werden.

Die Figure-Klasse hat nun die Methode subplots#

Die Klasse Figure hat nun eine Methode subplots(), die sich genauso verhält wie pyplot.subplots(), aber auf einer vorhandenen Figur.

Metadaten als Keyword-Argument für savefig#

savefig() akzeptiert nun metadata als Keyword-Argument. Es kann verwendet werden, um Schlüssel/Wert-Paare in den Bildmetadaten zu speichern.

  • 'png' mit Agg-Backend

  • 'pdf' mit PDF-Backend (siehe writeInfoDict() für eine Liste unterstützter Schlüsselwörter)

  • 'eps' und 'ps' mit PS-Backend (nur der Schlüssel 'Creator' wird akzeptiert)

plt.savefig('test.png', metadata={'Software': 'My awesome software'})

Busy-Cursor#

Die interaktiven GUI-Backends ändern nun den Cursor auf "beschäftigt", wenn Matplotlib die Zeichenfläche rendert.

PolygonSelector#

Eine Klasse PolygonSelector wurde zu matplotlib.widgets hinzugefügt. Details finden Sie unter Indizes aus einer Sammlung mit Polygon-Selektor auswählen.

Hinzugefügt: matplotlib.ticker.PercentFormatter#

Der neue Formatter PercentFormatter verfügt über einige nützliche Funktionen, wie z. B. die Möglichkeit, von beliebigen Datenskalen in Prozente umzuwandeln, ein anpassbares `%`-Symbol und entweder automatische oder manuelle Steuerung der Dezimalstellen.

Reproduzierbare PS-, PDF- und SVG-Ausgabe#

Die Umgebungsvariable SOURCE_DATE_EPOCH kann nun verwendet werden, um den Zeitstempelwert in der PS- und PDF-Ausgabe festzulegen. Siehe Source Date Epoch.

Alternativ kann durch Aufrufen von savefig mit metadata={'CreationDate': None} der Zeitstempel für das PDF-Backend ganz weggelassen werden.

Die Reproduzierbarkeit der Ausgabe von PS- und PDF-Backends wurde bisher mit verschiedenen Plot-Elementen getestet, jedoch nur mit Standardwerten von Optionen wie {ps,pdf}.fonttype, die die Ausgabe auf niedriger Ebene beeinflussen können, und nicht mit den Mathtext- oder Usetex-Funktionen. Wenn Matplotlib externe Werkzeuge (wie PS-Distiller oder LaTeX) aufruft, müssen deren Versionen für die Reproduzierbarkeit konstant gehalten werden, und sie können Quellen für Nichtdeterminismus hinzufügen, die außerhalb der Kontrolle von Matplotlib liegen.

Für die SVG-Ausgabe wurde in einer früheren Version der rc-Parameter svg.hashsalt hinzugefügt. Dieser Parameter ändert einige zufällige Bezeichner in der SVG-Datei, um sie deterministisch zu machen. Der Nachteil dieser Einstellung ist, dass, wenn mehr als eine Datei mit deterministischen Bezeichnern generiert wird und diese Teile eines größeren Dokuments bilden, die Bezeichner kollidieren und dazu führen können, dass sich die verschiedenen Teile gegenseitig beeinflussen.

Diese Funktionen sind nun in den Tests für die PDF- und SVG-Backends aktiviert, sodass die meisten Testausgabedateien (aber nicht alle) nun deterministisch sind.

Orthographische Projektion für mplot3d#

Axes3D akzeptiert nun das Keyword-Argument proj_type und hat eine Methode set_proj_type(). Die Standardoption ist wie bisher 'persp', und die Angabe von 'ortho' aktiviert die orthographische Ansicht.

Vergleichen Sie die z-Achse, die in orthographischer Ansicht vertikal ist, aber in der perspektivischen Ansicht leicht schräg.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.set_proj_type('persp')
ax1.set_title('Perspective (default)')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.set_proj_type('ortho')
ax2.set_title('Orthographic')

plt.show()

(Quellcode, 2x.png, png)

Funktion voxels für mplot3d#

Axes3D hat nun eine Methode voxels zur Visualisierung boolescher 3D-Daten. Anwendungsfälle könnten das Plotten einer spärlichen 3D-Heatmap oder die Visualisierung eines volumetrischen Modells sein.

../../_images/sphx_glr_voxels_numpy_logo_001.png

Voxel Demo#

Verbesserungen#

CheckButtons Widget: Funktion get_status#

Eine Methode get_status() wurde zur Klasse matplotlib.widgets.CheckButtons hinzugefügt. Diese Methode get_status ermöglicht es dem Benutzer, den Status (True/False) aller Buttons im CheckButtons-Objekt abzufragen.

Argument fill_bar zu AnchoredSizeBar hinzugefügt#

Die Klasse mpl_toolkits AnchoredSizeBar hat nun ein zusätzliches Argument fill_bar, das die Grössenleiste zu einem soliden Rechteck macht, anstatt nur den Rand des Rechtecks zu zeichnen. Der Standardwert ist None, und ob die Leiste standardmässig gefüllt wird, hängt vom Wert von size_vertical ab. Wenn size_vertical ungleich Null ist, wird fill_bar auf True gesetzt. Wenn size_vertical Null ist, wird fill_bar auf False gesetzt. Wenn Sie dieses Standardverhalten überschreiben möchten, setzen Sie fill_bar auf True oder False, um bedingungslos immer oder nie ein gefülltes Patch-Rechteck für die Grössenleiste zu verwenden.

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar

fig, ax = plt.subplots(figsize=(3, 3))

bar0 = AnchoredSizeBar(ax.transData, 0.3, 'unfilled', loc='lower left',
                       frameon=False, size_vertical=0.05, fill_bar=False)
ax.add_artist(bar0)
bar1 = AnchoredSizeBar(ax.transData, 0.3, 'filled', loc='lower right',
                       frameon=False, size_vertical=0.05, fill_bar=True)
ax.add_artist(bar1)

plt.show()

(Quellcode, 2x.png, png)

Annotationen können einen Standard-Pfeilstil verwenden#

Annotationen verwenden nun den Standard-Pfeilstil, wenn arrowprops={} gesetzt ist, anstatt keinen Pfeil (das neue Verhalten entspricht tatsächlich der Dokumentation).

Barbs und Quiver unterstützen Daten#

Bei Verwendung der Plot-Methoden quiver() und barbs() ist es nun möglich, Daten zu übergeben, ähnlich wie bei anderen Methoden wie plot(). Dies ermöglicht diesen Funktionen auch die Verarbeitung von Werten, bei denen eine Einheitenumrechnung erforderlich ist.

Standard-Linienfarbe für Hexbin#

Das Standard-Keyword-Argument linecolor für hexbin() ist nun 'face', und die Angabe von 'none' verhindert nun, dass Linien um die Sechsecke gezeichnet werden.

Figure.legend() kann ohne Argumente aufgerufen werden#

Der Aufruf von Figure.legend() kann nun ohne Argumente erfolgen. In diesem Fall wird eine Legende erstellt, die alle Künstler auf allen Achsen der Figur enthält.

Mehrere Legenden-Schlüssel für Legenden-Einträge#

Ein Legenden-Eintrag kann nun mehr als einen Legenden-Schlüssel enthalten. Die erweiterte Klasse HandlerTuple akzeptiert nun zwei Parameter: ndivide teilt den Legendenbereich in die angegebene Anzahl von Abschnitten; pad ändert den Abstand zwischen den Legenden-Schlüsseln.

../../_images/sphx_glr_legend_demo_004.png

Mehrere Legenden-Schlüssel#

Neuer Parameter clear für figure()#

Wenn die pyplot-Funktion figure() mit einem num-Parameter aufgerufen wird, wird nur dann ein neues Fenster erstellt, wenn kein vorhandenes Fenster mit demselben Wert existiert. Ein neuer boolescher Parameter clear wurde hinzugefügt, um den vorhandenen Inhalt explizit zu löschen. Dies ist besonders nützlich, wenn es in interaktiven Sitzungen verwendet wird. Da subplots() auch Schlüsselwortargumente von figure() akzeptiert, kann es auch dort verwendet werden.

import matplotlib.pyplot as plt

fig0 = plt.figure(num=1)
fig0.suptitle("A fancy plot")
print("fig0.texts: ", [t.get_text() for t in fig0.texts])

fig1 = plt.figure(num=1, clear=False)  # do not clear contents of window
fig1.text(0.5, 0.5, "Really fancy!")
print("fig0 is fig1: ",  fig0 is fig1)
print("fig1.texts: ", [t.get_text() for t in fig1.texts])

fig2, ax2 = plt.subplots(2, 1, num=1, clear=True)  # clear contents
print("fig0 is fig2: ",  fig0 is fig2)
print("fig2.texts: ", [t.get_text() for t in fig2.texts])

# The output:
# fig0.texts:  ['A fancy plot']
# fig0 is fig1:  True
# fig1.texts:  ['A fancy plot', 'Really fancy!']
# fig0 is fig2:  True
# fig2.texts:  []

Minimalwert zur Skalierung für LogFormatterMathtext festlegen#

LogFormatterMathtext enthält nun die Option, einen minimalen exponentiellen Wert anzugeben, der als Skalar formatiert werden soll (d. h. 0,001 statt 10-3).

Neues Keyword-Argument angle für QuiverKey#

Das Plotten eines quiverkey() erlaubt nun das Keyword-Argument angle, das den Winkel festlegt, in dem der Schlüsselpfeil gezeichnet wird.

Methode reversed für Colormap#

Die Methoden matplotlib.colors.LinearSegmentedColormap.reversed() und matplotlib.colors.ListedColormap.reversed() geben eine umgekehrte Instanz der Colormap zurück. Dies implementiert eine Möglichkeit, jede Colormap umzukehren.

artist.setp (und pyplot.setp) akzeptieren ein file-Argument#

Das Argument ist nur als Schlüsselwort zulässig. Es ermöglicht die Angabe einer Ausgabedatei, die von sys.stdout abweicht. Es verhält sich exakt wie das file-Argument für print.

Streamline-Generierung in streamplot flexibler gestaltet#

Der Startpunkt, die Richtung und die Länge der Stromlinien können nun konfiguriert werden. Dies ermöglicht eine längere Verfolgung des Vektorfeldes und kann die Sichtbarkeit des Strömungsmusters in einigen Anwendungsfällen verbessern.

Axis.set_tick_params reagiert nun auf rotation#

Das massenhafte Setzen der Rotation von Tick-Labels ist nun über tick_params() mit dem Schlüsselwort rotation möglich.

ax.tick_params(which='both', rotation=90)

Tick-Labels werden deaktiviert statt unsichtbar gemacht#

Intern wird nun das Attribut matplotlib.axis.Tick.label1On des Tick-Objekts verwendet, um Tick-Labels auszublenden, anstatt die Sichtbarkeit auf den Tick-Label-Objekten zu setzen. Dies verbessert die Gesamtleistung und behebt einige Probleme. Infolgedessen muss für den Fall, dass diese Labels angezeigt werden sollen, tick_params() verwendet werden, z. B.

ax.tick_params(labelbottom=True)

Schattierung in 3D-Balkendiagrammen#

Ein neuer Parameter shade wurde der 3D-Plot-Methode bar hinzugefügt. Das Standardverhalten ist weiterhin, die Balken zu schattieren, aber nun haben Benutzer die Möglichkeit, shade auf False zu setzen.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(2)
y = np.arange(3)
x2d, y2d = np.meshgrid(x, y)
x, y = x2d.ravel(), y2d.ravel()
z = np.zeros_like(x)
dz = x + y

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.bar3d(x, y, z, 1, 1, dz, shade=True)
ax1.set_title('Shading On')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.bar3d(x, y, z, 1, 1, dz, shade=False)
ax2.set_title('Shading Off')

plt.show()

(Quellcode, 2x.png, png)

Neuer Parameter which für autofmt_xdate#

Ein Parameter which existiert nun für die Methode autofmt_xdate(). Dies ermöglicht es einem Benutzer, selektiv major-, minor- oder both-Tick-Labels zu formatieren. Das Standardverhalten rotiert und richtet die major-Tick-Labels aus.

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right', which='minor')

Neuer Figuren-Parameter für subplot2grid#

Ein Parameter fig existiert nun für die Funktion subplot2grid(). Dies ermöglicht es einem Benutzer, die Figur anzugeben, in der die Subplots erstellt werden sollen. Wenn fig None ist (Standard), verwendet die Methode die aktuelle Figur, die von gcf() abgerufen wird.

subplot2grid(shape, loc, rowspan=1, colspan=1, fig=myfig)

Interpolation in fill_betweenx#

Der Parameter interpolate existiert nun für die Methode fill_betweenx(). Dies ermöglicht es einem Benutzer, die Daten zu interpolieren und die Bereiche an den Kreuzungspunkten zu füllen, ähnlich wie bei fill_between().

Neues Keyword-Argument sep für EngFormatter#

Ein neues Keyword-Argument sep wurde zu EngFormatter hinzugefügt und bietet eine Möglichkeit, den String zu definieren, der zwischen dem Wert und seiner Einheit verwendet wird. Der Standardstring ist " ", was das frühere Verhalten beibehält. Zusätzlich ist der Separator nun auch zwischen dem Wert und seiner Einheit vorhanden, auch wenn kein SI-Präfix vorhanden ist. Zuvor gab es einen Fehler, der dazu führte, dass Strings wie "3.14V" anstelle des erwarteten "3.14 V" (mit Standardverhalten) zurückgegeben wurden.

Erweiterung des Verhaltens von MATPLOTLIBRC#

Die Umgebungsvariable kann nun den vollständigen Dateipfad oder den Pfad zu einem Verzeichnis angeben, das eine matplotlibrc-Datei enthält.

density kwarg für hist#

Die Methode hist() bevorzugt nun density anstelle von normed, um zu steuern, ob das Histogramm normalisiert werden soll. Dies folgt einer Änderung in NumPy. Dies wird Verwirrung reduzieren, da das Integral des Histogramms immer 1 war (anstatt Summe oder Maximalwert).

Interna#

Neues TransformedPatchPath-Caching-Objekt#

Die neu hinzugefügte Klasse TransformedPatchPath bietet eine Möglichkeit, ein Patch über eine Transform in ein Path zu transformieren und dabei den resultierenden Pfad zu cachen. Wenn weder das Patch noch die Transformation geändert wurden, wird eine gecachte Kopie des Pfades zurückgegeben.

Diese Klasse unterscheidet sich von der älteren Klasse TransformedPath dadurch, dass sie sich basierend auf dem zugrunde liegenden Patch selbst aktualisieren kann, während die ältere Klasse einen unveränderlichen Pfad verwendet.

Abstrakte Basisklasse für Film-Writer#

Die neue Klasse AbstractMovieWriter definiert die API, die von einer Klasse benötigt wird, die als writer in der Methode matplotlib.animation.Animation.save() verwendet werden soll. Die bestehende Klasse MovieWriter leitet nun von der neuen abstrakten Basisklasse ab.

Strengere Validierung von Linienstil-rcparams#

Die Validierung von rcParams, die sich auf Linienstile beziehen (lines.linestyle, boxplot.*.linestyle, grid.linestyle und contour.negative_linestyle), prüft nun effektiv, ob die Werte gültige Linienstile sind. Zeichenketten wie 'dashed' oder '--' werden akzeptiert, ebenso wie gleichlange Sequenzen von An-/Aus-Linien wie [1, 1.65]. In letzterem Fall wird der Offset-Wert intern gehandhabt und sollte nicht vom Benutzer angegeben werden.

Das neue Validierungsschema ersetzt das frühere für die contour.negative_linestyle rcParams, das auf 'solid' und 'dashed' Linienstile beschränkt war.

Die Validierung ist nicht case-sensitiv. Folgendes ist nun gültig

grid.linestyle             : (1, 3)   # loosely dotted grid lines
contour.negative_linestyle : dashdot  # previously only solid or dashed

pytest#

Die automatisierten Tests wurden von nose auf pytest umgestellt.

Performance#

Updates zur Pfadvereinfachung#

Die Linienvereinfachung, gesteuert durch die Parameter path.simplify und path.simplify_threshold, wurde verbessert. Sie sollten eine bessere Rendering-Performance beim Plotten großer Datenmengen bemerken (solange die oben genannten Parameter entsprechend eingestellt sind). Nur der Liniensegment-Teil von Pfaden wird vereinfacht – wenn Sie auch Marker zeichnen und Probleme mit der Rendering-Geschwindigkeit haben, sollten Sie die Option markevery für plot in Betracht ziehen. Weitere Informationen finden Sie im Abschnitt Performance im Usage-Tutorial.

Die Vereinfachung funktioniert durch iteratives Zusammenführen von Liniensegmenten zu einem einzigen Vektor, bis der senkrechte Abstand des nächsten Liniensegments zum Vektor (gemessen im Display-Koordinatenraum) größer ist als der Parameter path.simplify_threshold. Daher führen höhere Werte von path.simplify_threshold zu schnelleren Rendering-Zeiten. Wenn Sie nur zum Erkunden von Daten und nicht für Veröffentlichungszwecke plotten, können Sie sicher einen Wert von 1.0 verwenden. Wenn Sie sicherstellen möchten, dass Ihr Plot Ihre Daten exakt widerspiegelt, sollten Sie path.simplify auf false und/oder path.simplify_threshold auf 0 setzen. Matplotlib verwendet derzeit einen konservativen Standardwert von 1/9; kleinere Werte werden wahrscheinlich keine sichtbaren Unterschiede in Ihren Plots verursachen.

Implementierung von intersects_bbox in C++#

intersects_bbox() wurde in C++ implementiert, was die Performance der automatischen Platzierung der Legende verbessert.