API-Änderungen für 3.1.0#

Verhaltensänderungen#

Matplotlib.use#

Das Wechseln von Backends über matplotlib.use ist jetzt standardmäßig erlaubt, unabhängig davon, ob matplotlib.pyplot importiert wurde. Wenn der Benutzer versucht, von einem bereits gestarteten interaktiven Backend zu einem anderen interaktiven Backend zu wechseln, wird ein ImportError ausgelöst.

Ungültige Punkte in PathCollections#

PathCollections, die mit scatter erstellt wurden, verfolgen jetzt ungültige Punkte. Zuvor wurden Punkte mit nicht-endlichen (unendlich oder NaN) Koordinaten nicht in die Offsets (wie von PathCollection.get_offsets zurückgegeben) einer von scatter erstellten PathCollection aufgenommen, und Punkte mit nicht-endlichen Werten (wie durch das Argument c angegeben) wurden nicht in das Array (wie von PathCollection.get_array zurückgegeben) aufgenommen.

Solche Punkte werden nun eingeschlossen, aber durch Rückgabe eines maskierten Arrays maskiert.

Wenn das Argument plotnonfinite an scatter gesetzt ist, werden Punkte mit nicht-endlichen Werten mit der schlechten Farbe der Colormap der collections.PathCollection (wie von colors.Colormap.set_bad() gesetzt) geplottet.

Alpha-Blending in imshow von RGBA-Eingaben#

Der Alpha-Kanal von RGBA-Bildern wird nun unabhängig von den RGB-Kanälen neu abgetastet. Obwohl dies eine Fehlerbehebung ist, ändert es die Ausgabe und kann dazu führen, dass einige nachgelagerte Bildvergleichstests fehlschlagen.

Automatische Skalierung

Auf Log-Achsen, auf denen ein einzelner Wert bei einem "vollen" Dekaden (1, 10, 100 usw.) geplottet wird, erweitert die automatische Skalierung die Achse nun symmetrisch um diesen Punkt, anstatt nur eine Dekade nach rechts hinzuzufügen.

Logarithmisch skalierte Achsen#

Wenn der Standard- LogLocator keine Ticks für eine Achse generieren würde (z. B. eine Achse mit Grenzen von 0,31 bis 0,39) oder nur einen einzelnen Tick, greift er nun stattdessen auf den linearen AutoLocator zurück, um vernünftige Tick-Positionen auszuwählen.

Figure.add_subplot ohne Argumente#

Der Aufruf von Figure.add_subplot() ohne Positionsargumente tat bisher nichts; dies ist nun äquivalent zu einem Aufruf von add_subplot(111).

bxp und rcparams#

bxp berücksichtigt jetzt rcParams["boxplot.boxprops.linewidth"] (Standard: 1.0), auch wenn patch_artist gesetzt ist. Zuvor ignorierte bxp rcParams["boxplot.boxprops.linewidth"] (Standard: 1.0), wenn der Parameter patch_artist gesetzt war. Dies war ein Versehen – insbesondere ignorierte boxplot ihn nicht.

Kollisionen von Haupt- und Nebenticks#

Nebenticks, die mit Hauptticks kollidieren, werden nun standardmäßig ausgeblendet. Zuvor enthielten bestimmte Locator-Klassen (LogLocator, AutoMinorLocator) benutzerdefinierte Logik, um die Ausgabe von Tick-Positionen zu vermeiden, die mit Hauptticks kollidieren, wenn sie als Nebentick-Locator verwendet wurden. Diese Logik wurde nun in die Axis-Klasse verschoben und wird unabhängig von der Locator-Klasse verwendet. Sie können dieses Verhalten über das Attribut remove_overlapping_locs auf Axis steuern.

Wenn Sie sich darauf verlassen haben, dass sowohl die Haupt- als auch die Nebentick-Beschriftungen am selben Tick erscheinen, müssen Sie Ihren Code möglicherweise aktualisieren. Zum Beispiel der folgende Schnipsel

import numpy as np
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

t = np.arange("2018-11-03", "2018-11-06", dtype="datetime64")
x = np.random.rand(len(t))

fig, ax = plt.subplots()
ax.plot(t, x)
ax.xaxis.set(
    major_locator=mdates.DayLocator(),
    major_formatter=mdates.DateFormatter("\n%a"),
    minor_locator=mdates.HourLocator((0, 6, 12, 18)),
    minor_formatter=mdates.DateFormatter("%H:%M"),
)
# disable removing overlapping locations
ax.xaxis.remove_overlapping_locs = False
plt.show()

beschriftete Tage mit Haupt-Ticks und Stunden und Minuten mit Nebenticks und fügte den Haupt-Tick-Beschriftungen einen Zeilenumbruch hinzu, um zu verhindern, dass sie mit den Nebentick-Beschriftungen kollidieren. Das Setzen der Eigenschaft remove_overlapping_locs (auch zugänglich über set_remove_overlapping_locs / get_remove_overlapping_locs und setp) deaktiviert das Entfernen überlappender Tick-Positionen.

Die Haupt-Tick-Beschriftungen könnten auch angepasst werden, um Stunden und Minuten einzuschließen, da die Nebenticks verschwunden sind, sodass der major_formatter wäre

mdates.DateFormatter("%H:%M\n%a")

usetex-Unterstützung#

Zuvor, wenn rcParams["text.usetex"] (Standard: False) True war, dann würde das Erstellen eines TextPath mit einem Nicht-Mathtext-String mit usetex=False vom Mathtext-Parser abhängen (aber nicht von der usetex-Unterstützung!), um den String zu parsen. Der Mathtext-Parser wird nicht mehr aufgerufen, was zu geringfügigen Änderungen der Glyphenpositionierung führen kann.

get_window_extents#

matplotlib.axes.Axes.get_window_extent gab zuvor eine Bounding Box zurück, die leicht größer als die Achsen war, vermutlich um die Ticks zu berücksichtigen, die sich auf einer Achse befinden könnten. Sie skalierte jedoch die Tick-Größen nicht entsprechend der DPI des Canvas und prüfte nicht, ob die Ticks sichtbar waren oder auf der Achse lagen.

Nun gibt matplotlib.axes.Axes.get_window_extent nur noch die Achsen-Grenzen ohne Polsterung für Ticks zurück.

Dies wirkt sich auf matplotlib.axes.Axes.get_tightbbox aus, wenn nach außen gerichtete Ticks ohne Tick-Beschriftungen vorhanden sind, und entfernt in diesem Fall auch das (kleine) Polster um die Achsen.

spines.Spine.get_window_extent berücksichtigt nun Ticks, die sich auf der Achse befinden.

Sankey#

Zuvor akzeptierte Sankey.add nur eine einzelne Zeichenkette als Argument labels, wenn ihre Länge der Anzahl der Flüsse entsprach, in welchem Fall sie ein Zeichen pro Fluss verwendete.

Das Verhalten wurde geändert, um dem dokumentierten zu entsprechen: Wenn eine einzelne Zeichenkette übergeben wird, wird sie verwendet, um alle Flüsse zu beschriften.

FontManager-Scores#

font_manager.FontManager.score_weight ist nun strenger bei seinen Eingaben. Zuvor, wenn eine Gewichts-Zeichenkette an font_manager.FontManager.score_weight übergeben wurde,

  • wurde sie in eine Ganzzahl umgewandelt, wenn das Gewicht die String-Darstellung einer Ganzzahl war,

  • andernfalls, wenn das Gewicht kein Standard-Gewichtsname war, wurde es stillschweigend durch einen Wert von 500 ("normales" Gewicht) ersetzt.

font_manager.FontManager.score_weight löst nun bei solchen Eingaben eine Ausnahme aus.

Textausrichtung#

Die Textausrichtung war zuvor fehlerhaft, insbesondere bei mehrzeiligen Textobjekten mit großen Unterlängen (d.h. tiefgestellten Zeichen) und gedrehtem Text. Diese wurden behoben und konsistenter gemacht, aber älterer Code, der dies kompensiert hat, hat möglicherweise nicht mehr die korrekte Ausrichtung.

Großbuchstaben-Farbzeichenketten#

Die Unterstützung für die Übergabe von Ein-Buchstaben-Farben (einer von "rgbcmykw") als GROSSBUCHSTABEN ist veraltet; diese Farben werden nach Ablauf der Deprekationsperiode case-sensitiv (Kleinbuchstaben).

Ziel ist es, die Anzahl der mehrdeutigen Fälle bei der Verwendung des data-Schlüsselworts bei Plotting-Methoden zu verringern; z.B. wird plot("X", "Y", data={"X": ..., "Y": ...}) nach Ablauf der Deprekationsperiode nicht mehr warnen, dass "Y" möglicherweise eine Farbe ist.

Degenerierte Grenzen#

Wenn Grenzen, die an set_xlim übergeben werden, degeneriert sind (d. h. der untere und obere Wert sind gleich), "erweitert" die Methode die Grenzen nun so, dass sie dem Erweiterungsverhalten der automatischen Skalierung entspricht, wenn der Plot einen einzelnen x-Wert enthält, und sollte insbesondere schönere Grenzen für nicht-lineare Skalen ergeben.

plot Format-String-Parsing#

In bestimmten Fällen akzeptierte plot zuvor Format-Strings, die mehr als einen Linienstil angaben (z. B. "---.", der sowohl "--" als auch "-." angibt); nur einer davon wurde verwendet. Dies löst nun stattdessen einen ValueError aus.

HTMLWriter#

Der HTMLWriter-Konstruktor ist strenger: er normalisiert unbekannte Werte von default_mode nicht mehr zu 'loop', sondern gibt stattdessen einen Fehler aus.

AFM-Parsing#

Im Einklang mit der AFM-Spezifikation schneidet der AFM-Parser die Felder UnderlinePosition und UnderlineThickness nicht mehr auf Ganzzahlen ab.

Das Feld Notice (das nur über die veraltete API afm.parse_afm öffentlich zugänglich ist) wird nicht mehr in einen str dekodiert, sondern als bytes beibehalten, um nicht konforme AFM-Dateien zu unterstützen, die nicht-ASCII-Zeichen in diesem Feld verwenden.

Artist.set Keyword-Normalisierung#

Artist.set normalisiert nun Keywords, bevor sie sortiert werden. Zuvor sortierte es seine Schlüsselwortargumente in umgekehrter alphabetischer Reihenfolge (mit einem Sonderfall, um color ans Ende zu stellen), bevor es sie anwendete.

Es normalisiert nun Aliase (und gibt wie oben erwähnt eine Warnung bei doppelten Eigenschaften aus), bevor es sortiert (so dass auch c ans Ende kommt).

Argumentenprüfung für Axes.tick_params#

Zuvor tat Axes.tick_params stillschweigend nichts, wenn ein ungültiger axis-Parameter übergeben wurde. Dieses Verhalten wurde geändert, um stattdessen einen ValueError auszulösen.

Ausgabe von Axes.hist#

Eingaben, die aus mehreren leeren Listen bestehen, geben nun eine Liste von Histogrammwerten für jede der Listen zurück. Zum Beispiel gibt eine Eingabe von [[],[]] 2 Listen von Histogrammwerten zurück. Zuvor wurde eine einzelne Liste zurückgegeben.

Signaturänderung von backend_bases.TimerBase.remove_callback für die Zukunft#

Derzeit entfernt backend_bases.TimerBase.remove_callback(func, *args, **kwargs) einen zuvor von backend_bases.Timer.add_callback(func, *args, **kwargs) hinzugefügten Callback, aber wenn *args, **kwargs nicht übergeben werden (d. h. TimerBase.remove_callback(func)), wird der erste Callback mit übereinstimmendem func entfernt, unabhängig davon, ob er mit oder ohne *args, **kwargs hinzugefügt wurde.

In einer zukünftigen Version wird TimerBase.remove_callback immer das letztere Verhalten verwenden (nicht *args, **kwargs berücksichtigen); um sie explizit zu berücksichtigen, fügen Sie den Callback als functools.partial-Objekt hinzu.

cb = timer.add_callback(functools.partial(func, *args, **kwargs))
# ...
# later
timer.remove_callback(cb)

TimerBase.add_callback wurde so geändert, dass func zurückgegeben wird, um die obige Verwendung zu vereinfachen (zuvor wurde None zurückgegeben); dies ermöglicht auch die Verwendung als Dekorator.

Die neue API ist an atexit.register / atexit.unregister angelehnt.

Leistungssteigerung bei StemContainer#

StemContainer-Objekte können nun ein LineCollection-Objekt anstelle einer Liste von Line2D-Objekten für Stamm-Linien, die mit stem geplottet wurden, speichern. Dies führt zu einer sehr großen Leistungssteigerung beim Anzeigen und Bewegen von stem-Plots.

Dies wird das Standardverhalten in Matplotlib 3.3 sein. Um es jetzt zu verwenden, kann das Schlüsselwortargument use_line_collection an stem auf True gesetzt werden.

ax.stem(..., use_line_collection=True)

Einzelne Liniensegmente können aus der LineCollection mit get_segments() extrahiert werden. Sehen Sie die Dokumentation zu LineCollection für weitere Methoden zum Abrufen der Sammlungseigenschaften.

Vererbung von ColorbarBase#

matplotlib.colorbar.ColorbarBase ist keine Unterklasse mehr von cm.ScalarMappable. Diese Vererbung führte zu einer verwirrenden Situation, in der die an matplotlib.colorbar.Colorbar (colorbar) übergebene cm.ScalarMappable eine set_norm-Methode hatte, ebenso wie der Colorbar. Der Colorbar ist nun rein ein Nachfolger der ScalarMappable-Norm und Colormap, und die alten geerbten Methoden matplotlib.colorbar.ColorbarBase.set_norm, matplotlib.colorbar.ColorbarBase.set_cmap, matplotlib.colorbar.ColorbarBase.set_clim sind veraltet, ebenso wie die Getter-Versionen dieser Aufrufe. Um die mit einem Colorbar assoziierte Norm zu setzen, rufen Sie colorbar.mappable.set_norm() etc. auf.

FreeType- und libpng-Suchpfade#

Die Umgebungsvariablen MPLBASEDIRLIST und der Eintrag basedirlist in setup.cfg haben keine Wirkung mehr. Stattdessen, wenn beim Bauen in Situationen, in denen FreeType oder libpng nicht im Standardpfad des Compilers oder Linkers enthalten sind, die Standardumgebungsvariablen CFLAGS/LDFLAGS unter Linux oder OSX, oder CL/LINK unter Windows gesetzt werden, um die relevanten Pfade anzugeben.

Details finden Sie unter Installation.

Künstler-Eigenschaften zweimal oder mehr im selben Aufruf setzen#

Das mehrfache Setzen derselben Künstler-Eigenschaft über Aliase ist veraltet. Zuvor gab Code wie

plt.plot([0, 1], c="red", color="blue")

eine Warnung aus, die darauf hinwies, dass c und color Aliase voneinander sind, und behielt nur das Schlüsselwortargument color bei. Dieses Verhalten ist veraltet; in einer zukünftigen Version wird dies einen TypeError auslösen, ähnlich dem Verhalten von Python, wenn ein Schlüsselwortargument zweimal übergeben wird.

plt.plot([0, 1], c="red", c="blue")

Diese Warnung wird von normalize_kwargs ausgelöst.

Pfad-Code-Typen#

Pfadcode-Typen wie Path.MOVETO sind jetzt np.uint8 anstelle von int Path.STOP, Path.MOVETO, Path.LINETO, Path.CURVE3, Path.CURVE4 und Path.CLOSEPOLY sind jetzt vom Typ Path.code_type (np.uint8 standardmäßig) anstelle von einfachem int. Dies stellt sicher, dass ihr Typ dem Array-Werttyp des Path.codes-Arrays entspricht.

LaTeX-Code in der matplotlibrc-Datei#

Zuvor wurden die rc-Datei-Schlüssel pgf.preamble und text.latex.preamble mit Kommas als Trennzeichen geparst. Dies hätte gültigen LaTeX-Code unterbrochen, wie z. B.

\usepackage[protrusion=true, expansion=false]{microtype}

Das Parsen wurde so geändert, dass die vollständige Zeile an das LaTeX-System übergeben wird, wobei alle Kommas erhalten bleiben. Das Übergeben einer Liste von Zeichenketten aus einem Python-Skript funktioniert weiterhin wie bisher. Das Übergeben einer Liste, die keine Zeichenketten enthält, schlägt nun fehl, anstatt die Ergebnisse in Zeichenketten umzuwandeln.

Axes.spy#

Die Methode Axes.spy löst nun für die Schlüsselwortargumente interpolation und linestyle einen TypeError aus, anstatt sie stillschweigend zu ignorieren.

Darüber hinaus erlaubt Axes.spy nun ein extent-Argument (wurde bisher stillschweigend ignoriert).

Ein Fehler bei Axes.spy(..., origin='lower') wurde behoben. Zuvor wurde die Grafik aber nicht die y-Achse gespiegelt, was zu einer Diskrepanz zwischen Achsenbeschriftungen und tatsächlichen Datenindizes führte. Nun werden mit origin='lower' sowohl die Daten als auch die y-Achsenbeschriftungen gespiegelt.

Boxplot-Tick-Methoden#

Der Parameter manage_xticks von boxplot und bxp wurde umbenannt (mit einer Verfallsperiode) zu manage_ticks, um der Tatsache Rechnung zu tragen, dass er je nach vert-Parameter entweder x- oder y-Ticks verwaltet.

Wenn manage_ticks=True (standardmäßig), versuchen diese Methoden nun, zuvor gezeichnete Boxplots bei der Festlegung der Achsenlimits, Ticks und Tick-Beschriftungen zu berücksichtigen.

MouseEvents#

MouseEvents enthalten nun den Ereignisnamen in ihrer str()-Darstellung. Zuvor enthielten sie das Präfix "MPL MouseEvent".

RGBA-Puffer-Rückgabetyp#

FigureCanvasAgg.buffer_rgba und RendererAgg.buffer_rgba geben nun eine memoryview zurück. Die Methode buffer_rgba ermöglicht nun den direkten Zugriff auf den zugrunde liegenden Puffer des Renderers (als memoryview der Form (m, n, 4)), anstatt die Daten in eine neue Byte-Zeichenkette zu kopieren. Dies entspricht dem Verhalten unter Py2, wo ein Pufferobjekt zurückgegeben wurde.

Rückgabetyp von matplotlib.font_manager.win32InstalledFonts#

matplotlib.font_manager.win32InstalledFonts gibt eine leere Liste anstelle von None zurück, wenn keine Schriftarten gefunden werden.

Fehlerbehandlung von Axes.fmt_xdata und Axes.fmt_ydata#

Zuvor würde, wenn der Benutzer eine Funktion Axes.fmt_xdata oder Axes.fmt_ydata bereitstellte, die einen TypeError auslöste (oder sie auf etwas Nicht-Aufrufbares setzte), die Ausnahme stillschweigend ignoriert und stattdessen der Standardformatierer verwendet. Dies ist nicht mehr der Fall; die Ausnahme wird nun weitergegeben.

Veraltung redundanter Tick-Attribute#

Die Tick-Attribute gridOn, tick1On, tick2On, label1On und label2On sind veraltet. Greifen Sie direkt auf die Sichtbarkeit der zugrunde liegenden Künstler zu und legen Sie diese fest, die als Attribute gridline, tick1line, tick2line, label1 und label2 verfügbar sind.

Das Attribut label, das ein Alias für label1 war, ist veraltet.

Unterklassen, die sich auf das Festlegen der oben genannten Sichtbarkeitsattribute verlassen haben, müssen aktualisiert werden; siehe z. B. examples/api/skewt.py.

Die Übergabe des drawstyle einer Line2D zusammen mit dem linestyle ist veraltet#

Anstelle von plt.plot(..., linestyle="steps--") verwenden Sie plt.plot(..., linestyle="--", drawstyle="steps"). ds ist jetzt ein Alias für drawstyle.

pgi-Unterstützung eingestellt#

Die Unterstützung für pgi in den GTK3-Backends wurde eingestellt. pgi ist eine alternative Implementierung zu PyGObject. PyGObject sollte stattdessen verwendet werden.

Änderungen an rcParam#

Entfernt#

Die folgenden veralteten rcParams wurden entfernt

  • text.dvipnghack

  • nbagg.transparent (verwenden Sie stattdessen rcParams["figure.facecolor"] (Standard: 'white'))

  • plugins.directory

  • axes.hold

  • backend.qt4 und backend.qt5 (setzen Sie stattdessen die Umgebungsvariable QT_API)

Veraltet#

Die zugehörigen Validierungsfunktionen rcsetup.validate_qt4 und validate_qt5 sind veraltet.

Die rcParams verbose.fileo und verbose.level sind veraltet. Diese hatten keine Auswirkung mehr seit dem Wechsel von Matplotlibs altem benutzerdefiniertem Verbose-Logging zum Standard-Python-Modul logging. Zusätzlich ist die Funktion rcsetup.validate_verbose veraltet.

Der rcParam text.latex.unicode hat nun standardmäßig True und ist veraltet (d. h. in zukünftigen Versionen von Matplotlib wird Unicode-Input immer unterstützt). Darüber hinaus verwendet die zugrunde liegende Implementierung nun \usepackage[utf8]{inputenc} anstelle von \usepackage{ucs}\usepackage[utf8x]{inputenc}.

Ausnahmeänderungen#

  • mpl_toolkits.axes_grid1.axes_size.GetExtentHelper löst nun für ungültige Richtungen einen ValueError anstelle eines KeyError aus.

  • Zuvor lösten Fehler bei Subprozessen im Animationsframework entweder einen RuntimeError oder einen ValueError aus, je nachdem, wann der Fehler auftrat. Sie lösen nun einen subprocess.CalledProcessError aus, dessen Attribute wie in der Dokumentation der Ausnahmeklasse beschrieben gesetzt sind.

  • In bestimmten Fällen lösten Achsenmethoden (und pyplot-Funktionen) einen RuntimeError aus, wenn sie mit einem data-Keyword-Argument und ansonsten nicht übereinstimmenden Argumenten aufgerufen wurden. Sie lösen nun stattdessen einen TypeError aus.

  • Axes.streamplot unterstützt keine unregelmäßig gegitterten x- und y-Werte. Bisher wurde ein falsches Ergebnis stillschweigend geplottet. Dies wurde geändert, sodass nun stattdessen ein ValueError ausgelöst wird.

  • Die Klasse streamplot.Grid, die intern vom Streamplot-Code verwendet wird, löst ebenfalls einen ValueError aus, wenn unregelmäßig gegitterte Werte übergeben werden.

Entfernungen#

Die folgenden veralteten APIs wurden entfernt

Klassen und Methoden#

  • Verbose (ersetzt durch das Python-Logging-Modul)

  • artist.Artist.hitlist (kein Ersatz)

  • artist.Artist.is_figure_set (verwenden Sie stattdessen artist.figure is not None)

  • axis.Axis.unit_data (verwenden Sie stattdessen axis.Axis.units)

  • backend_bases.FigureCanvasBase.onRemove (kein Ersatz) backend_bases.FigureManagerBase.show_popup (dies tat nie etwas)

  • backend_wx.SubplotToolWx (kein Ersatz)

  • backend_wx.Toolbar (verwenden Sie stattdessen backend_wx.NavigationToolbar2Wx)

  • cbook.align_iterators (kein Ersatz)

  • contour.ContourLabeler.get_real_label_width (kein Ersatz)

  • legend.Legend.draggable (verwenden Sie stattdessen legend.Legend.set_draggable())

  • texmanager.TexManager.postscriptd, texmanager.TexManager.pscnt, texmanager.TexManager.make_ps, texmanager.TexManager.get_ps_bbox (keine Ersetzungen)

Argumente#

Andere#

Die folgenden sonstigen API-Elemente wurden entfernt

  • svgfont-Unterstützung (in rcParams["svg.fonttype"] (Standard: 'path'))

  • Das Logging erfolgt nun mit der Standard-Python-Bibliothek logging. matplotlib.verbose und die Kommandozeilenschalter --verbose-LEVEL wurden entfernt.

    Zur Steuerung der Logging-Ausgabe verwenden Sie

    import logging
    logger = logging.getLogger('matplotlib')
    logger.setLevel(logging.INFO)
    # configure log handling: Either include it into your ``logging`` hierarchy,
    # e.g. by configuring a root looger using ``logging.basicConfig()``,
    # or add a standalone handler to the matplotlib logger:
    logger.addHandler(logging.StreamHandler())
    
  • __version__numpy__

  • collections.CIRCLE_AREA_FACTOR

  • font_manager.USE_FONTCONFIG

  • font_manager.cachedir

matplotlib.mlab-Entfernungen#

Ein Großteil des Codes im Modul matplotlib.mlab, der in Matplotlib 2.2 als veraltet markiert war, wurde entfernt. Siehe unten für eine Liste

  • mlab.exp_safe (verwenden Sie stattdessen numpy.exp)

  • mlab.amap

  • mlab.logspace (verwenden Sie stattdessen numpy.logspace)

  • mlab.rms_flat

  • mlab.l1norm (verwenden Sie stattdessen numpy.linalg.norm(a, ord=1))

  • mlab.l2norm (verwenden Sie stattdessen numpy.linalg.norm(a, ord=2))

  • mlab.norm_flat (verwenden Sie stattdessen numpy.linalg.norm(a.flat, ord=2))

  • mlab.frange (verwenden Sie stattdessen numpy.arange)

  • mlab.identity (verwenden Sie stattdessen numpy.identity)

  • mlab.base_repr

  • mlab.binary_repr

  • mlab.ispower2

  • mlab.log2 (verwenden Sie stattdessen numpy.log2)

  • mlab.isvector

  • mlab.movavg

  • mlab.safe_isinf (verwenden Sie stattdessen numpy.isinf)

  • mlab.safe_isnan (verwenden Sie stattdessen numpy.isnan)

  • mlab.cohere_pairs (verwenden Sie stattdessen scipy.signal.coherence)

  • mlab.entropy (verwenden Sie stattdessen scipy.stats.entropy)

  • mlab.normpdf (verwenden Sie scipy.stats.norm.pdf stattdessen)

  • mlab.find (verwenden Sie np.nonzero(np.ravel(condition)) stattdessen)

  • mlab.longest_contiguous_ones

  • mlab.longest_ones

  • mlab.PCA

  • mlab.prctile (verwenden Sie stattdessen numpy.percentile)

  • mlab.prctile_rank

  • mlab.center_matrix

  • mlab.rk4 (verwenden Sie stattdessen scipy.integrate.ode)

  • mlab.bivariate_normal

  • mlab.get_xyz_where

  • mlab.get_sparse_matrix

  • mlab.dist (verwenden Sie stattdessen numpy.hypot)

  • mlab.dist_point_to_segment

  • mlab.griddata (verwenden Sie scipy.interpolate.griddata)

  • mlab.less_simple_linear_interpolation (verwenden Sie numpy.interp)

  • mlab.slopes

  • mlab.stineman_interp

  • mlab.segments_intersect

  • mlab.fftsurr

  • mlab.offset_line

  • mlab.quad2cubic

  • mlab.vector_lengths

  • mlab.distances_along_curve

  • mlab.path_length

  • mlab.cross_from_above

  • mlab.cross_from_below

  • mlab.contiguous_regions (verwenden Sie stattdessen cbook.contiguous_regions)

  • mlab.is_closed_polygon

  • mlab.poly_between

  • mlab.poly_below

  • mlab.inside_poly

  • mlab.csv2rec

  • mlab.rec2csv (verwenden Sie stattdessen numpy.recarray.tofile)

  • mlab.rec2text (verwenden Sie stattdessen numpy.recarray.tofile)

  • mlab.rec_summarize

  • mlab.rec_join

  • mlab.recs_join

  • mlab.rec_groupby

  • mlab.rec_keep_fields

  • mlab.rec_drop_fields

  • mlab.rec_append_fields

  • mlab.csvformat_factory

  • mlab.get_formatd

  • mlab.FormatDatetime (verwenden Sie stattdessen datetime.datetime.strftime)

  • mlab.FormatDate (verwenden Sie stattdessen datetime.date.strftime)

  • mlab.FormatMillions, mlab.FormatThousands, mlab.FormatPercent, mlab.FormatBool, mlab.FormatInt, mlab.FormatFloat, mlab.FormatFormatStr, mlab.FormatString, mlab.FormatObj

  • mlab.donothing_callback

pylab-Entfernungen#

Ein Großteil des Codes im Modul matplotlib.mlab, der in Matplotlib 2.2 als veraltet markiert war, wurde entfernt. Das bedeutet, dass die folgenden Funktionen nicht mehr im Modul pylab verfügbar sind

  • amap

  • base_repr

  • binary_repr

  • bivariate_normal

  • center_matrix

  • csv2rec (verwenden Sie stattdessen numpy.recarray.tofile)

  • dist (verwenden Sie stattdessen numpy.hypot)

  • dist_point_to_segment

  • distances_along_curve

  • entropy (verwenden Sie stattdessen scipy.stats.entropy)

  • exp_safe (verwenden Sie stattdessen numpy.exp)

  • fftsurr

  • find (verwenden Sie np.nonzero(np.ravel(condition)) stattdessen)

  • frange (verwenden Sie stattdessen numpy.arange)

  • get_sparse_matrix

  • get_xyz_where

  • griddata (verwenden Sie scipy.interpolate.griddata stattdessen)

  • identity (verwenden Sie stattdessen numpy.identity)

  • inside_poly

  • is_closed_polygon

  • ispower2

  • isvector

  • l1norm (verwenden Sie stattdessen numpy.linalg.norm(a, ord=1))

  • l2norm (verwenden Sie stattdessen numpy.linalg.norm(a, ord=2))

  • log2 (verwenden Sie stattdessen numpy.log2)

  • longest_contiguous_ones

  • longest_ones

  • movavg

  • norm_flat (verwenden Sie stattdessen numpy.linalg.norm(a.flat, ord=2))

  • normpdf (verwenden Sie scipy.stats.norm.pdf stattdessen)

  • path_length

  • poly_below

  • poly_between

  • prctile (verwenden Sie stattdessen numpy.percentile)

  • prctile_rank

  • rec2csv (verwenden Sie stattdessen numpy.recarray.tofile)

  • rec_append_fields

  • rec_drop_fields

  • rec_join

  • rk4 (verwenden Sie stattdessen scipy.integrate.ode)

  • rms_flat

  • segments_intersect

  • slopes

  • stineman_interp

  • vector_lengths

mplot3d-Änderungen#

Voxel-Schattierung#

Axes3D.voxels schattiert nun die resultierenden Voxel; weitere Details finden Sie unter Was ist neu. Das frühere Verhalten kann durch Übergabe erreicht werden

ax.voxels(.., shade=False)

Gleichmäßige Achsen deaktiviert#

Das Festlegen des Seitenverhältnisses für 3D-Achsen gab zuvor unsinnige Ergebnisse zurück (siehe z. B. #1077). Das Aufrufen von ax.set_aspect('equal') oder ax.set_aspect(num) auf einer 3D-Achse löst nun ein NotImplementedError aus.

Poly3DCollection.set_zsort#

Poly3DCollection.set_zsort ignoriert ungültige Eingaben oder False (was immer fehlerhaft war) nicht mehr stillschweigend. Das Übergeben von True, um "average" zu bedeuten, ist veraltet.

Tests#

Das Flag --no-network für tests.py wurde entfernt (kein Test benötigt mehr Internetzugriff). Wenn die Deaktivierung des Internetzugangs sowohl für alte als auch für neue Versionen von Matplotlib gewünscht ist, verwenden Sie tests.py -m 'not network' (was nun eine No-Op ist).

Die Decorators für Bildvergleichstests überspringen (anstatt xfail) jetzt den Test für nicht vergleichbare Formate. Die betroffenen Decorators sind image_comparison und check_figures_equal. Die veraltete Klasse ImageComparisonTest wird ebenfalls geändert.

Änderungen bei Abhängigkeiten#

NumPy#

Matplotlib 3.1 erfordert jetzt NumPy>=1.11.

ghostscript#

Die Unterstützung für ghostscript 8.60 (veröffentlicht 2007) wurde entfernt. Die älteste unterstützte Version von ghostscript ist nun 9.0 (veröffentlicht 2010).

Mathtext-Änderungen#

  • In Konstrukten wie "$1~2$" interpretiert mathtext die Tilde jetzt als Leerzeichen, konsistent mit TeX (dies war zuvor ein Parse-Fehler).

Deprecations#

  • Der \stackrel Mathtext-Befehl wurde als veraltet markiert (er verhielt sich anders als der LaTeX-Befehl \stackrel. Um zwei Mathtext-Ausdrücke zu stapeln, verwenden Sie \genfrac{left-delim}{right-delim}{fraction-bar-thickness}{}{top}{bottom}.

  • Der \mathcircled Mathtext-Befehl (der kein echter TeX-Befehl ist) ist veraltet. Verwenden Sie stattdessen direkt Unicode-Zeichen (z. B. "\N{CIRCLED LATIN CAPITAL LETTER A}" oder "\u24b6").

  • Die Einstellung von rcParams["mathtext.default"] (Standard: 'it') auf "circled" ist veraltet.

Signatur-Veralterungen#

Die folgenden signaturbezogenen Verhaltensweisen sind veraltet

  • Das Schlüsselwortargument withdash für Axes.text(). Verwenden Sie stattdessen Axes.annotate().

  • Das Übergeben von Fehler-Arrays der Form (n, 1) an Axes.errorbar(), was nicht dokumentiert war und für n = 2 nicht funktionierte. Übergeben Sie stattdessen ein 1D-Array.

  • Das Schlüsselwortargument frameon für savefig und der rcParam savefig.frameon. Um frameon = False zu emulieren, setzen Sie facecolor auf vollständig transparent ("none" oder (0, 0, 0, 0)).

  • Das Übergeben einer nicht-1D-Eingabe (typischerweise der Form (n, 1)) an Axes.pie. Übergeben Sie stattdessen ein 1D-Array.

  • Der Konstruktor von TextPath hat zuvor ignorierte Argumente stillschweigend verworfen; dieses Verhalten ist veraltet.

  • Der Parameter usetex von TextToPath.get_text_path ist veraltet und wurde in den Parameter ismath integriert, der nun die Werte False, True und "TeX" annehmen kann, konsistent mit anderen Low-Level-Textverarbeitungsfunktionen.

  • Das Übergeben von 'normal' an axes.Axes.axis() ist veraltet, verwenden Sie stattdessen ax.axis('auto').

  • Das positionelle Übergeben des Arguments block von pyplot.show ist veraltet; es sollte als Schlüsselwort übergeben werden.

  • Bei Verwendung des nbagg-Backends hat pyplot.show stillschweigend alle Kombinationen von Positions- und Schlüsselwortargumenten akzeptiert und ignoriert. Dieses Verhalten ist veraltet.

  • Die ungenutzten Parameter shape und imlim für Axes.imshow sind veraltet. Um die Verwarnung vor Veralterung zu vermeiden, sollten die Argumente filternorm, filterrad, resample und url als Schlüsselwörter übergeben werden.

  • Der Parameter interp_at_native für BboxImage, der seit Matplotlib 2.0 keine Auswirkung mehr hatte, ist veraltet.

  • Alle Argumente des Decorators matplotlib.cbook.deprecation.deprecated und der Funktion matplotlib.cbook.deprecation.warn_deprecated, mit Ausnahme des ersten Arguments (die Version, in der die Veralterung auftrat), sind jetzt nur noch als Schlüsselwort zulässig. Ziel ist es, versehentliches Setzen des Arguments "message" zu vermeiden, wenn das Argument "name" (oder "alternative") gemeint war, da dies in der Vergangenheit wiederholt vorgekommen ist.

  • Die Argumente von matplotlib.testing.compare.calculate_rms wurden von expectedImage, actualImage in expected_image, actual_image umbenannt.

  • Das positionelle Übergeben von Argumenten an Axis.set_ticklabels über ticklabels hinaus hat keine Auswirkung und die Unterstützung dafür ist veraltet.

  • Das Übergeben von shade=None an plot_surface ist veraltet. Dies war ein unbeabsichtigtes Implementierungsdetail mit denselben Semantiken wie shade=False. Bitte verwenden Sie stattdessen Letzteres.

  • matplotlib.ticker.MaxNLocator und seine set_params Methode geben eine Warnung bei unbekannten Schlüsselwortargumenten aus, anstatt sie stillschweigend zu ignorieren. Zukünftige Versionen werden einen Fehler auslösen.

Änderungen bei Parameternamen#

In jedem Fall bleibt der alte Parametername unterstützt (er kann nicht gleichzeitig mit dem neuen Namen verwendet werden), aber die Unterstützung dafür wird in Matplotlib 3.3 eingestellt.

Klassen-/Methoden-/Attribut-Veralterungen#

Die Unterstützung für benutzerdefinierte Backends, die keine GraphicsContextBase.set_hatch_color-Methode bereitstellen, ist veraltet. Wir empfehlen benutzerdefinierten Backends, ihre GraphicsContext-Klasse von GraphicsContextBase erben zu lassen, um zumindest Stubs für alle erforderlichen Methoden bereitzustellen.

  • spine.Spine.is_frame_like

Dies wurde seit seiner Einführung im Jahr 2009 nicht mehr im Code verwendet.

  • axis3d.Axis.get_tick_positions

    Dies wurde intern nie verwendet, es gibt keine äquivalente Methode für die 2D-Axis-Klassen, und trotz des ähnlichen Namens hat es ein völlig anderes Verhalten als die 2D-Axis-Methode axis.Axis.get_ticks_position.

  • .backend_pgf.LatexManagerFactory

  • mpl_toolkits.axisartist.axislines.SimpleChainedObjects

  • mpl_toolkits.Axes.AxisDict

Interne Hilfsfunktionen#

  • checkdep_dvipng

  • checkdep_ghostscript

  • checkdep_pdftops

  • checkdep_inkscape

  • ticker.decade_up

  • ticker.decade_down

  • cbook.dedent

  • docstring.Appender

  • docstring.dedent

  • docstring.copy_dedent

Verwenden Sie stattdessen die Werkzeuge zur Docstring-Manipulation der Standardbibliothek, wie inspect.cleandoc und inspect.getdoc.

  • matplotlib.scale.get_scale_docs()

  • matplotlib.pyplot.get_scale_docs()

Diese gelten als intern und werden in einer zukünftigen Version aus der öffentlichen API entfernt.

  • projections.process_projection_requirements

  • backend_ps.PsBackendHelper

  • backend_ps.ps_backend_helper,

  • cbook.iterable

  • cbook.get_label

  • cbook.safezip Prüfen Sie stattdessen manuell die Längen der Eingaben oder verlassen Sie sich auf NumPy.

  • cbook.is_hashable Verwenden Sie stattdessen isinstance(..., collections.abc.Hashable).

  • Die Methode .backend_bases.RendererBase.strip_math. Verwenden Sie stattdessen cbook.strip_math.

Mehrere interne Funktionen, die als Teil der öffentlichen API von mpl_toolkits.mplot3d verfügbar gemacht wurden, sind veraltet,

mpl_toolkits.mplot3d.art3d

  • mpl_toolkits.mplot3d.art3d.norm_angle

  • mpl_toolkits.mplot3d.art3d.norm_text_angle

  • mpl_toolkits.mplot3d.art3d.path_to_3d_segment

  • mpl_toolkits.mplot3d.art3d.paths_to_3d_segments

  • mpl_toolkits.mplot3d.art3d.path_to_3d_segment_with_codes

  • mpl_toolkits.mplot3d.art3d.paths_to_3d_segments_with_codes

  • mpl_toolkits.mplot3d.art3d.get_patch_verts

  • mpl_toolkits.mplot3d.art3d.get_colors

  • mpl_toolkits.mplot3d.art3d.zalpha

mpl_toolkits.mplot3d.proj3d

  • mpl_toolkits.mplot3d.proj3d.line2d

  • mpl_toolkits.mplot3d.proj3d.line2d_dist

  • mpl_toolkits.mplot3d.proj3d.line2d_seg_dist

  • mpl_toolkits.mplot3d.proj3d.mod

  • mpl_toolkits.mplot3d.proj3d.proj_transform_vec

  • mpl_toolkits.mplot3d.proj3d.proj_transform_vec_clip

  • mpl_toolkits.mplot3d.proj3d.vec_pad_ones

  • mpl_toolkits.mplot3d.proj3d.proj_trans_clip_points

Wenn Ihr Projekt auf diesen Funktionen basiert, sollten Sie erwägen, sie selbst einzubinden.

Schriftartverwaltung#

  • backend_pdf.RendererPdf.afm_font_cache

  • backend_ps.RendererPS.afmfontd

  • font_manager.OSXInstalledFonts

  • .TextToPath.glyph_to_path (Rufen Sie stattdessen font.get_path() auf und transformieren Sie den Pfad manuell.)

Axes3D#

  • .axes3d.Axes3D.w_xaxis

  • .axes3d.Axes3D.w_yaxis

  • .axes3d.Axes3D.w_zaxis

Verwenden Sie stattdessen axes3d.Axes3D.xaxis, axes3d.Axes3D.yaxis und axes3d.Axes3D.zaxis.

Tests#

  • Der Decorator matplotlib.testing.decorators.switch_backend

Testfunktionen sollten pytest.mark.backend verwenden, und der Markierer wird von der Fixture matplotlib.testing.conftest.mpl_test_settings aufgegriffen.

Pfeilspitzen (Quiver)#

  • Das Attribut .color von Quiver-Objekten

Verwenden Sie stattdessen (wie bei jeder Collection) die Methode get_facecolor. Beachten Sie, dass das Setzen auf das Attribut .color den Pfeilspitzen-Künstler nicht aktualisierte, während der Aufruf von set_facecolor dies tut.

GUI / Backend-Details#

  • .get_py2exe_datafiles

  • .tk_window_focus

  • .backend_gtk3.FileChooserDialog

  • .backend_gtk3.NavigationToolbar2GTK3.get_filechooser

  • .backend_gtk3.SaveFigureGTK3.get_filechooser

  • Das Attribut .NavigationToolbar2QT.adj_window. Dies ist ungenutzt und immer None.

  • Die globale Variable .backend_wx.IDLE_DELAY. Diese ist ungenutzt und nur relevant für den nun entfernten wx "idling"-Code (beachten Sie, dass aufgrund ihres Modul-weiten Geltungsbereichs keine Verwarnung vor Veralterung ausgegeben wird, wenn darauf zugegriffen wird).

  • mlab.demean

  • backend_gtk3cairo.FigureCanvasGTK3Cairo,

  • backend_wx.debug_on_error, backend_wx.fake_stderr, backend_wx.raise_msg_to_str, backend_wx.MenuButtonWx, backend_wx.PrintoutWx,

  • Das Modul matplotlib.backends.qt_editor.formlayout

Dieses Modul ist eine eingebundene, modifizierte Version des offiziellen formlayout-Moduls, das auf PyPI verfügbar ist. Installieren Sie dieses Modul separat, wenn Sie es benötigen.

  • GraphicsContextPS.shouldstroke

Transformationen / Skalen#

  • LogTransformBase

  • Log10Transform

  • Log2Transform,

  • NaturalLogTransformLog

  • InvertedLogTransformBase

  • InvertedLog10Transform

  • InvertedLog2Transform

  • InvertedNaturalLogTransform

Diese Klassen in matplotlib.scale sind veraltet. Als Ersatz verwenden Sie die allgemeinen Klassen LogTransform und InvertedLogTransform, deren Konstruktoren ein base-Argument entgegennehmen.

Locator / Formatierer#

  • OldScalarFormatter.pprint_val

  • ScalarFormatter.pprint_val

  • LogFormatter.pprint_val

Dies sind Hilfsmethoden, die keine konsistente Signatur über die Formatiererklassen hinweg haben.

Pfad-Werkzeuge#

  • path.get_paths_extents

Verwenden Sie stattdessen get_path_collection_extents.

  • Das Attribut .Path.has_nonfinite

Verwenden Sie stattdessen not np.isfinite(path.vertices).all().

  • Die Funktion .bezier.find_r_to_boundary_of_closedpath ist veraltet

Diese gab immer None zurück, anstatt den angeforderten Radius.

Text#

  • text.TextWithDash

  • Text.is_math_text

  • TextPath.is_math_text

  • TextPath.text_get_vertices_codes (Als Alternative konstruieren Sie ein neues TextPath-Objekt.)

Ungenutzte Attribute#

  • NavigationToolbar2QT.buttons

  • Line2D.verticalOffset

  • Quiver.keytext

  • Quiver.keyvec

  • SpanSelector.buttonDown

Diese sind ungenutzt und werden nie aktualisiert.

Sphinx-Erweiterungen#

  • matplotlib.sphinxext.mathmpl.math_directive

  • matplotlib.sphinxext.plot_directive.plot_directive

Dies liegt daran, dass die Schnittstellen matplotlib.sphinxext.mathmpl und matplotlib.sphinxext.plot_directive von der (von Sphinx) veralteten funktionsbasierten Schnittstelle zu einer klassenbasierten Schnittstelle geändert wurden; dies sollte Endbenutzer nicht beeinträchtigen.

  • mpl_toolkits.axisartist.axis_artist.UnimplementedException

Umgebungsvariablen#

  • Die Umgebungsvariable MATPLOTLIBDATA

Achse#

  • Axis.iter_ticks

Dies diente nur als Hilfsmittel für die private Methode Axis._update_ticks.

Wiederaufhebung von Veralterungen#

Die folgenden API-Elemente wurden von der Veralterung befreit

  • Das Schlüsselwortargument obj_type des Decorators matplotlib.cbook.deprecation.deprecated.

  • Die Schlüsselwortargumente xmin, xmax für Axes.set_xlim und ymin, ymax für Axes.set_ylim

Neue Funktionen#

Text hat jetzt einen Alias c für die Eigenschaft color#

Zur Konsistenz mit Line2D hat die Klasse Text den Alias c für die Eigenschaft color erhalten. Man kann jetzt zum Beispiel schreiben

ax.text(.5, .5, "foo", c="red")

Cn-Farben unterstützen jetzt n>=10#

Es ist nun möglich, über die zehnte Farbe im Eigenschaftszyklus hinauszugehen, indem die Syntax Cn verwendet wird, z. B.

plt.plot([1, 2], color="C11")

verwendet nun die 12. Farbe im Zyklus.

Beachten Sie, dass zuvor eine Konstruktion wie

plt.plot([1, 2], "C11")

als Aufforderung interpretiert würde, die Farbe C1 und den Marker 1 (ein "invertiertes Y") zu verwenden. Um ein solches Diagramm zu erhalten, sollte man nun

plt.plot([1, 2], "1C1")

(damit die erste "1" korrekt als Marker-Spezifikation interpretiert wird), oder, expliziter

plt.plot([1, 2], marker="1", color="C1")

Neue Methode Formatter.format_ticks#

Die Klasse Formatter hat eine neue Methode format_ticks erhalten, die die Liste aller Tick-Positionen als einzelnes Argument entgegennimmt und die Liste aller formatierten Werte zurückgibt. Sie wird vom Tick-Handling-Code der Achse aufgerufen und ruft standardmäßig zuerst set_locs mit allen Positionen auf und dann wiederholt Formatter.__call__ für jede Position.

Tick-Handling-Code im Codebestand, der zuvor diese Sequenz durchführte (set_locs gefolgt von wiederholtem Formatter.__call__), wurde aktualisiert, um format_ticks zu verwenden.

format_ticks ist dazu bestimmt, von Formatter-Unterklassen überschrieben zu werden, für die die Formatierung eines Tick-Werts von anderen Tick-Werten abhängt, wie z. B. ConciseDateFormatter.

Unterstützung für RGB(A)-Bilder in pcolorfast hinzugefügt#

pcolorfast akzeptiert jetzt 3D-Bild-Arrays (RGB oder RGBA), wenn die X- und Y-Spezifikationen die Darstellung von Bild oder pcolorimage zulassen; diese bleiben von der allgemeineren quadmesh-Darstellung nicht unterstützt.

Ungültige Eingaben#

Das Übergeben ungültiger Positionen an legend und table fiel früher auf eine Standardposition zurück. Dieses Verhalten ist veraltet und wird in einer zukünftigen Version eine Ausnahme auslösen.

offsetbox.AnchoredText kann die Schlüsselwortargumente horizontalalignment oder verticalalignment nicht verarbeiten und ignorierte sie bisher mit einer Warnung. Dieses Verhalten ist veraltet und wird in einer zukünftigen Version eine Ausnahme auslösen.

Das Übergeben von Schritten kleiner als 1 oder größer als 10 an MaxNLocator führte früher zu undefiniertem Verhalten. Jetzt wird ein ValueError ausgelöst.

Die Signatur der (privaten) Methode Axis._update_ticks wurde geändert, so dass sie den Renderer nicht mehr als Argument annimmt (dieses Argument wird nicht verwendet).