Änderungen für 0.54#

MATLAB-Schnittstelle#

dpi#

Einige der Backends verwendeten einen PIXELS_PER_INCH-Hack, den ich hinzugefügt habe, um zu versuchen, Bilder über verschiedene Backends hinweg konsistent darzustellen. Das hat die Angelegenheit nur verkompliziert. Daher können Sie feststellen, dass einige Schriftgrößen und Linienbreiten anders aussehen als zuvor. Entschuldigung für die Unannehmlichkeiten. Sie sollten die dpi auf einen genauen Wert für Ihren Bildschirm einstellen, um echte Größen zu erhalten.

pcolor und scatter#

Es gibt zwei Änderungen an der MATLAB-Schnittstellen-API, die beide die Patch-Zeichenbefehle betreffen. Aus Effizienzgründen wurden pcolor und scatter neu geschrieben, um Polygon-Kollektionen zu verwenden. Dies sind neue Objekte aus matplotlib.collections, die für die effiziente Handhabung großer Objektsammlungen konzipiert sind. Diese neuen Kollektionen ermöglichen es, große Scatter-Plots oder pcolor-Plots ohne Schleifen auf Python-Ebene zu erstellen, und sind deutlich schneller als ihre Vorgänger. Die ursprünglichen Funktionen pcolor und scatter bleiben als pcolor_classic und scatter_classic erhalten.

Der Rückgabewert von pcolor ist eine PolyCollection. Die meisten Eigenschaften, die für Rechtecke oder andere Patches verfügbar sind, sind auch für PolyCollections verfügbar, z. B. können Sie sagen:

c = scatter(blah, blah)
c.set_linewidth(1.0)
c.set_facecolor('r')
c.set_alpha(0.5)

oder

c = scatter(blah, blah)
set(c, 'linewidth', 1.0, 'facecolor', 'r', 'alpha', 0.5)

Da die Kollektion ein einzelnes Objekt ist, müssen Sie nicht mehr über den Rückgabewert von scatter oder pcolor iterieren, um Eigenschaften für die gesamte Liste festzulegen.

Wenn Sie möchten, dass sich die verschiedenen Elemente einer Kollektion in einer Eigenschaft unterscheiden, z. B. unterschiedliche Linienbreiten haben, siehe matplotlib.collections für eine Diskussion darüber, wie die Eigenschaften als Sequenz festgelegt werden.

Für scatter ist das size-Argument nun in Punkten^2 (die Fläche des Symbols in Punkten) wie in MATLAB und nicht mehr in Datenkoordinaten wie zuvor. Die Verwendung von Größen in Datenkoordinaten verursachte mehrere Probleme. Sie müssen daher Ihre Größenargumente entsprechend anpassen oder scatter_classic verwenden.

mathtext-Abstände#

Aus mir unklaren Gründen (die ich schließlich beheben werde) funktionieren Abstände in Schriftgruppen nicht mehr. Ich habe jedoch drei neue Abstands-Befehle hinzugefügt, die dies kompensieren: '' (normaler Abstand), '/' (kleiner Abstand) und 'hspace{frac}', wobei frac ein Bruchteil der Schriftgröße in Punkten ist. Leerzeichen in Schriftzeichenketten müssen zitiert werden, ist

title(r'$\rm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')

Objekt-Schnittstelle - Anwendungsprogrammierer#

Automatische Skalierung

Die x- und y-Achseninstanzen haben keine autoscale view mehr. Diese werden von axes.autoscale_view behandelt.

Achsen-Erstellung#

Sie sollten Ihre eigenen Achsen nicht mehr über die OO-API instanziieren. Erstellen Sie stattdessen wie zuvor eine Figure und anstelle von

f = Figure(figsize=(5,4), dpi=100)
a = Subplot(f, 111)
f.add_axis(a)

verwenden Sie

f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)

Das heißt, add_axis existiert nicht mehr und wird ersetzt durch

add_axes(rect, axisbg=defaultcolor, frameon=True)
add_subplot(num, axisbg=defaultcolor, frameon=True)

Artist-Methoden#

Wenn Sie Ihre eigenen Artists definieren, müssen Sie die Methode _draw in draw umbenennen.

Begrenzungsrahmen#

matplotlib.transforms.Bound2D wird durch matplotlib.transforms.Bbox ersetzt. Wenn Sie einen bbox aus links, unten, breite, höhe (die Signatur für Bound2D) erstellen möchten, verwenden Sie matplotlib.transforms.lbwh_to_bbox, wie in

bbox = clickBBox = lbwh_to_bbox(left, bottom, width, height)

Die Bbox hat eine andere API als Bound2D. z. B. wenn Sie die Breite und Höhe der bbox erhalten möchten

ALT:

width  = fig.bbox.x.interval()
height = fig.bbox.y.interval()

NEU:

width  = fig.bbox.width()
height = fig.bbox.height()

Objekt-Konstruktoren#

Sie übergeben die bbox, dpi oder Transforms nicht mehr an die verschiedenen Artist-Konstruktoren. Der alte Weg der Erstellung von Linien und Rechtecken war umständlich, da Sie so viele Attribute an die Klassen Line2D und Rectangle übergeben mussten, die nicht direkt mit der Geometrie und den Eigenschaften des Objekts zusammenhängen. Jetzt werden Standardwerte zum Objekt hinzugefügt, wenn Sie axes.add_line oder axes.add_patch aufrufen, sodass sie für den Benutzer verborgen sind.

Wenn Sie eine benutzerdefinierte Transformation für diese Objekte definieren möchten, rufen Sie o.set_transform(trans) auf, wobei trans eine Transformation-Instanz ist.

In früheren Versionen mussten Sie, wenn Sie eine benutzerdefinierte Linie in Datenkoordinaten hinzufügen wollten, Folgendes tun:

l = Line2D(dpi, bbox, x, y,
           color = color,
           transx = transx,
           transy = transy,
           )

Jetzt benötigen Sie nur noch

l = Line2D(x, y, color=color)

und die Achsen setzen die Transformation für Sie (es sei denn, Sie haben bereits Ihre eigene festgelegt, in diesem Fall wird sie unverändert belassen).

Transformationen#

Die gesamte Transformationsarchitektur wurde neu geschrieben. Zuvor wurden die x- und y-Transformationen in den xaxis- und yaxis-Instanzen gespeichert. Das Problem bei diesem Ansatz ist, dass er nur separierbare Transformationen zulässt (bei denen die x- und y-Transformationen nicht voneinander abhängen). Aber für Fälle wie Polar tut dies. Jetzt operieren Transformationen gemeinsam auf x und y. Es gibt eine neue Basisklasse matplotlib.transforms.Transformation und zwei konkrete Implementierungen: matplotlib.transforms.SeparableTransformation und matplotlib.transforms.Affine. Die SeparableTransformation wird mit dem Begrenzungsrahmen der Eingabe (dies bestimmt das rechteckige Koordinatensystem der Eingabe, d. h. die x- und y-Ansichtsgrenzen), dem Begrenzungsrahmen der Anzeige und möglicherweise nichtlinearen Transformationen von x und y konstruiert. Die 2 am häufigsten verwendeten Transformationen, Datenkoordinaten -> Anzeige und Achsenkoordinaten -> Anzeige, sind als ax.transData und ax.transAxes verfügbar. Siehe alignment_demo.py, das Achsenkoordinaten verwendet.

Außerdem sollten die Transformationen aus zwei Gründen deutlich schneller sein

  • sie sind vollständig in Erweiterungscode geschrieben

  • da sie gemeinsam auf x und y operieren, können sie die gesamte Transformation in einer Schleife durchführen. Zuvor habe ich etwas Ähnliches getan:

    xt = sx*func(x) + tx
    yt = sy*func(y) + ty
    

    Obwohl dies in numerix geschah, beinhaltet es immer noch 6 * Länge(x) for-Schleifen (die Multiplikation, Addition und Funktionsauswertung jeweils für x und y). Jetzt wird all das in einem einzigen Durchgang erledigt.

Wenn Sie Transformationen und Begrenzungsrahmen verwenden, um die Cursorposition in Datenkoordinaten zu erhalten, sind die Methodenaufrufe jetzt etwas anders. Siehe das aktualisierte examples/coords_demo.py, das zeigt, wie das geht.

Ebenso, wenn Sie die Artist-Begrenzungsrahmen verwenden, um Elemente auf der Leinwand mit der GUI auszuwählen, sind die bbox-Methoden etwas anders. Sie müssen das aktualisierte examples/object_picker.py sehen.

Siehe unit/transforms_unit.py für viele Beispiele, die die neuen Transformationen verwenden.