Anmerkungen #

Text kommentieren mit Matplotlib.

from matplotlib import pyplot as plt

Grundlegende Anmerkung #

Die Verwendung des Basic text()platziert Text an einer beliebigen Position auf den Achsen. Ein häufiger Anwendungsfall für Text ist das Kommentieren eines Merkmals des Diagramms, und die annotate()Methode bietet Hilfsfunktionen, um das Kommentieren zu vereinfachen. Bei einer Annotation sind zwei Punkte zu beachten: die annotierte Stelle, die durch das Argument xy dargestellt wird, und die Stelle des Textes xytext . Beide Argumente sind Tupel.(x, y)

../../_images/sphx_glr_annotation_basic_001.png

In diesem Beispiel sind sowohl die xy- (Pfeilspitze) als auch die xytext- Position (Textposition) in Datenkoordinaten. Es gibt eine Vielzahl anderer Koordinatensysteme, die man auswählen kann – Sie können das Koordinatensystem von xy und xytext mit einer der folgenden Zeichenfolgen für xycoords und textcoords angeben (Standard ist „data“)

Streit

Koordinatensystem

'Figurenpunkte'

Punkte von der unteren linken Ecke der Figur

'Zahl Pixel'

Pixel von der unteren linken Ecke der Figur

'Zahlenbruch'

(0, 0) ist unten links in der Abbildung und (1, 1) ist oben rechts

'Achsenpunkte'

Punkte von der unteren linken Ecke der Achsen

'Achsen Pixel'

Pixel von der unteren linken Ecke der Achsen

'Achsenbruch'

(0, 0) ist die untere linke Achse und (1, 1) ist die obere rechte

'Daten'

Verwenden Sie das Achsendaten-Koordinatensystem

Um beispielsweise die Textkoordinaten in Bruchachsenkoordinaten zu platzieren, könnte man Folgendes tun:

ax.annotate('local max', xy=(3, 1),  xycoords='data',
            xytext=(0.8, 0.95), textcoords='axes fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='right', verticalalignment='top',
            )

Bei physikalischen Koordinatensystemen (Punkte oder Pixel) ist der Ursprung unten links in der Figur oder den Achsen.

Optional können Sie das Zeichnen eines Pfeils vom Text zum annotierten Punkt aktivieren, indem Sie ein Wörterbuch mit Pfeileigenschaften im optionalen Schlüsselwortargument arrowprops angeben .

Pfeilprops- Taste

Bezeichnung

Breite

die Breite des Pfeils in Punkten

frac

der Bruchteil der Pfeillänge, der vom Kopf eingenommen wird

Kopfbreite

die Breite der Basis der Pfeilspitze in Punkten

schrumpfen

Bewegen Sie die Spitze und die Basis einige Prozent vom annotierten Punkt und Text weg

**Kwarg

beliebige Taste für matplotlib.patches.Polygon, zBfacecolor

Im folgenden Beispiel befindet sich der xy -Punkt in nativen Koordinaten ( xycoords ist standardmäßig „data“). Bei Polarachsen liegt dies im (Theta-, Radius-) Raum. Der Text in diesem Beispiel wird im Bruchzahl-Koordinatensystem platziert. matplotlib.text.Text Schlüsselwortargumente wie horizontalalignment , verticalalignment und fontsize werden von annotatean die TextInstanz übergeben.

../../_images/sphx_glr_annotation_polar_001.png

Weitere Informationen zu all den wilden und wunderbaren Dingen, die Sie mit Anmerkungen machen können, einschließlich ausgefallener Pfeile, finden Sie unter Erweiterte Anmerkungen und Diagramme kommentieren .

Fahren Sie nicht fort, es sei denn, Sie haben bereits grundlegende Anmerkungen gelesen , text()und annotate()!

Erweiterte Anmerkungen #

Kommentieren mit Text mit Box #

Beginnen wir mit einem einfachen Beispiel.

../../_images/sphx_glr_annotate_text_arrow_001.png

textnimmt ein bbox- Schlüsselwortargument, das einen Rahmen um den Text zeichnet:

t = ax.text(
    0, 0, "Direction", ha="center", va="center", rotation=45, size=15,
    bbox=dict(boxstyle="rarrow,pad=0.3", fc="cyan", ec="b", lw=2))

Auf das mit dem Text verknüpfte Patch-Objekt kann zugegriffen werden durch:

bb = t.get_bbox_patch()

Der Rückgabewert ist ein FancyBboxPatch; Patch-Eigenschaften (Oberflächenfarbe, Kantenbreite usw.) können wie gewohnt aufgerufen und geändert werden. FancyBboxPatch.set_boxstylelegt die Boxform fest:

bb.set_boxstyle("rarrow", pad=0.6)

Die Argumente sind der Name des Boxstils mit seinen Attributen als Schlüsselwortargumente. Derzeit sind die folgenden Boxstile implementiert.

Klasse

Name

Attr

Kreis

circle

Auflage = 0,3

Pfeil

darrow

Auflage = 0,3

Pfeil

larrow

Auflage = 0,3

RPfeil

rarrow

Auflage = 0,3

Runden

round

pad=0.3,rounding_size=Keine

Runde4

round4

pad=0.3,rounding_size=Keine

Rundzahn

roundtooth

pad=0.3,tooth_size=Keine

Sägezahn

sawtooth

pad=0.3,tooth_size=Keine

Quadrat

square

Auflage = 0,3

../../_images/sphx_glr_fancybox_demo_001.png

Beachten Sie, dass die Attributargumente innerhalb des Stilnamens mit trennendem Komma angegeben werden können (diese Form kann als „boxstyle“-Wert des bbox-Arguments verwendet werden, wenn die Textinstanz initialisiert wird).

bb.set_boxstyle("rarrow,pad=0.6")

Kommentieren mit Pfeil #

annotatezeichnet einen Pfeil, der zwei Punkte in einer Achse verbindet:

ax.annotate("Annotation",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='offset points',
            )

Dies beschriftet einen Punkt bei xy in der angegebenen Koordinate ( xycoords ) mit dem Text bei xytext , der in textcoords angegeben ist . Häufig wird der kommentierte Punkt in den Datenkoordinaten und der kommentierende Text in Offset-Punkten angegeben . Siehe annotatefür verfügbare Koordinatensysteme.

Ein Pfeil, der xy mit xytext verbindet, kann optional gezeichnet werden, indem das Argument arrowprops angegeben wird . Um nur einen Pfeil zu zeichnen, verwenden Sie als erstes Argument eine leere Zeichenfolge.

ax.annotate("",
            xy=(0.2, 0.2), xycoords='data',
            xytext=(0.8, 0.8), textcoords='data',
            arrowprops=dict(arrowstyle="->",
                            connectionstyle="arc3"),
            )
../../_images/sphx_glr_annotate_simple01_001.png

Der Pfeil wird wie folgt gezeichnet:

  1. Ein Pfad, der die beiden Punkte verbindet, wird erstellt, wie durch den connectionstyle -Parameter angegeben.

  2. Der Pfad wird abgeschnitten, um die Patches patchA und patchB zu vermeiden , falls diese gesetzt sind.

  3. Der Pfad wird weiter durch ShrinkA und ShrinkB (in Pixeln) geschrumpft.

  4. Der Pfad wird in ein Pfeilfeld umgewandelt , wie durch den Pfeilstil- Parameter angegeben.

../../_images/sphx_glr_annotate_explain_001.png

Die Erstellung des Verbindungspfades zwischen zwei Punkten wird per connectionstyleTaste gesteuert und die folgenden Stile sind verfügbar.

Name

Attr

angle

Winkel A = 90, Winkel B = 0, Rad = 0,0

angle3

Winkel A = 90, Winkel B = 0

arc

angleA=0,angleB=0,armA=Keine,armB=Keine,rad=0.0

arc3

Rad = 0,0

bar

ArmA = 0,0, ArmB = 0,0, Bruchteil = 0,3, Winkel = Keine

Beachten Sie, dass „3“ in angle3und arc3anzeigen soll, dass der resultierende Pfad ein quadratisches Spline-Segment ist (drei Kontrollpunkte). Wie unten diskutiert wird, können einige Pfeilstiloptionen nur verwendet werden, wenn der Verbindungspfad ein quadratischer Spline ist.

Das Verhalten der einzelnen Verbindungsstile wird im folgenden Beispiel (eingeschränkt) demonstriert. (Warnung: Das Verhalten des barStils ist derzeit nicht gut definiert, es kann in Zukunft geändert werden).

../../_images/sphx_glr_connectionstyle_demo_001.png

Der Verbindungspfad (nach dem Beschneiden und Schrumpfen) wird dann gemäß der angegebenen zu einem Pfeilpatch mutiert arrowstyle.

Name

Attr

-

Keiner

->

Kopflänge = 0,4, Kopfbreite = 0,2

-[

Breite B = 1,0, Länge B = 0,2, Winkel B = Keine

|-|

Breite A = 1,0, Breite B = 1,0

-|>

Kopflänge = 0,4, Kopfbreite = 0,2

<-

Kopflänge = 0,4, Kopfbreite = 0,2

<->

Kopflänge = 0,4, Kopfbreite = 0,2

<|-

Kopflänge = 0,4, Kopfbreite = 0,2

<|-|>

Kopflänge = 0,4, Kopfbreite = 0,2

fancy

Kopflänge = 0,4, Kopfbreite = 0,4, Schwanzbreite = 0,4

simple

Kopflänge = 0,5, Kopfbreite = 0,5, Schwanzbreite = 0,2

wedge

tail_width=0.3,shrink_factor=0.5

../../_images/sphx_glr_fancyarrow_demo_001.png

Einige Pfeilstile funktionieren nur mit Verbindungsstilen, die ein quadratisches Spline-Segment erzeugen. Sie sind fancy, simple, und wedge. Für diese Pfeilstile müssen Sie den Verbindungsstil „angle3“ oder „arc3“ verwenden.

Wenn die Anmerkungszeichenfolge angegeben ist, wird patchA standardmäßig auf den Bbox-Patch des Textes gesetzt.

../../_images/sphx_glr_annotate_simple02_001.png

Wie bei kann mit dem Argument bboxtext ein Rahmen um den Text gezogen werden .

../../_images/sphx_glr_annotate_simple03_001.png

Standardmäßig ist der Startpunkt auf die Mitte der Textausdehnung festgelegt. Dies kann mit relposSchlüsselwert angepasst werden. Die Werte sind auf den Umfang des Textes normiert. Beispiel: (0, 0) bedeutet untere linke Ecke und (1, 1) bedeutet obere rechte Ecke.

../../_images/sphx_glr_annotate_simple04_001.png

Künstler an verankerten Axes-Standorten platzieren #

Es gibt Klassen von Künstlern, die an einem verankerten Ort in den Achsen platziert werden können. Ein typisches Beispiel ist die Legende. Diese Art von Künstler kann mithilfe der OffsetBoxKlasse erstellt werden. Einige vordefinierte Klassen sind in matplotlib.offsetboxund in verfügbar mpl_toolkits.axes_grid1.anchored_artists.

from matplotlib.offsetbox import AnchoredText

fig, ax = plt.subplots()
at = AnchoredText(
    "Figure 1a", prop=dict(size=15), frameon=True, loc='upper left')
at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
ax.add_artist(at)
Anmerkungen
<matplotlib.offsetbox.AnchoredText object at 0x7f2cdd7d9cf0>

Das Schlüsselwort loc hat die gleiche Bedeutung wie im Befehl legend.

Eine einfache Anwendung ist, wenn die Größe des Künstlers (oder der Sammlung von Künstlern) zum Zeitpunkt der Erstellung in Pixelgröße bekannt ist. Wenn Sie beispielsweise einen Kreis mit einer festen Größe von 20 Pixel x 20 Pixel (Radius = 10 Pixel) zeichnen möchten, können Sie AnchoredDrawingArea. Die Instanz wird mit einer Größe des Zeichenbereichs (in Pixel) erstellt, und beliebige Künstler können dem Zeichenbereich hinzugefügt werden. Beachten Sie, dass die Ausmaße der Künstler, die dem Zeichenbereich hinzugefügt werden, nicht mit der Platzierung des Zeichenbereichs selbst zusammenhängen. Es kommt nur auf die Ausgangsgröße an.

Die zum Zeichenbereich hinzugefügten Künstler sollten keinen Transformationssatz haben (dieser wird überschrieben) und die Abmessungen dieser Künstler werden als Pixelkoordinaten interpretiert, dh der Radius der Kreise im obigen Beispiel beträgt 10 Pixel und 5 Pixel , beziehungsweise.

from matplotlib.patches import Circle
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDrawingArea

fig, ax = plt.subplots()
ada = AnchoredDrawingArea(40, 20, 0, 0,
                          loc='upper right', pad=0., frameon=False)
p1 = Circle((10, 10), 10)
ada.drawing_area.add_artist(p1)
p2 = Circle((30, 10), 5, fc="r")
ada.drawing_area.add_artist(p2)
ax.add_artist(ada)
Anmerkungen
<mpl_toolkits.axes_grid1.anchored_artists.AnchoredDrawingArea object at 0x7f2cde0e07f0>

Manchmal möchten Sie, dass Ihre Künstler mit den Datenkoordinaten (oder anderen Koordinaten als Leinwandpixeln) skalieren. Sie können AnchoredAuxTransformBoxKlasse verwenden. Dies ist ähnlich, AnchoredDrawingAreaaußer dass der Umfang des Künstlers während der Zeichenzeit unter Berücksichtigung der spezifizierten Transformation bestimmt wird.

Die Ellipse im Beispiel unten hat eine Breite und Höhe, die 0,1 und 0,4 in Datenkoordinaten entsprechen, und wird automatisch skaliert, wenn sich die Ansichtsgrenzen der Achsen ändern.

from matplotlib.patches import Ellipse
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredAuxTransformBox

fig, ax = plt.subplots()
box = AnchoredAuxTransformBox(ax.transData, loc='upper left')
el = Ellipse((0, 0), width=0.1, height=0.4, angle=30)  # in data coordinates!
box.drawing_area.add_artist(el)
ax.add_artist(box)
Anmerkungen
<mpl_toolkits.axes_grid1.anchored_artists.AnchoredAuxTransformBox object at 0x7f2cde48dea0>

Wie in der Legende kann das Argument bbox_to_anchor gesetzt werden. Mit dem HPacker und VPacker können Sie eine Anordnung (?) von Künstlern wie in der Legende haben (tatsächlich wird die Legende so erstellt).

../../_images/sphx_glr_anchored_box04_001.png

Beachten Sie, dass im Gegensatz zur Legende die bbox_transformstandardmäßig auf IdentityTransform festgelegt ist.

Koordinatensysteme für Anmerkungen #

Matplotlib-Anmerkungen unterstützen mehrere Arten von Koordinaten. Einige sind in Grundlegende Anmerkungen beschrieben ; erweiterte Optionen sind

  1. Eine TransformInstanz. Zum Beispiel,

    ax.annotate("Test", xy=(0.5, 0.5), xycoords=ax.transAxes)
    

    ist identisch mit

    ax.annotate("Test", xy=(0.5, 0.5), xycoords="axes fraction")
    

    Dies ermöglicht das Beschriften eines Punktes in anderen Achsen:

    fig, (ax1, ax2) = plt.subplots(1, 2)
    ax2.annotate("Test", xy=(0.5, 0.5), xycoords=ax1.transData,
                 xytext=(0.5, 0.5), textcoords=ax2.transData,
                 arrowprops=dict(arrowstyle="->"))
    
  2. Eine ArtistInstanz. Der xy - Wert (oder xytext ) wird als Bruchkoordinate der bbox (Rückgabewert von get_window_extent ) des Künstlers interpretiert:

    an1 = ax.annotate("Test 1", xy=(0.5, 0.5), xycoords="data",
                      va="center", ha="center",
                      bbox=dict(boxstyle="round", fc="w"))
    an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1,  # (1, 0.5) of the an1's bbox
                      xytext=(30, 0), textcoords="offset points",
                      va="center", ha="left",
                      bbox=dict(boxstyle="round", fc="w"),
                      arrowprops=dict(arrowstyle="->"))
    
    ../../_images/sphx_glr_annotate_simple_coord01_001.png

    Beachten Sie, dass Sie sicherstellen müssen, dass die Ausdehnung des Koordinatenkünstlers ( an1 im obigen Beispiel) bestimmt ist, bevor an2 gezeichnet wird. Normalerweise bedeutet dies, dass an2 nach an1 gezeichnet werden muss .

  3. TransformEin aufrufbares Objekt, das die Renderer-Instanz als einzelnes Argument akzeptiert und entweder a oder a zurückgibt BboxBase. Der Rückgabewert wird dann wie in (1) für Transformationen oder in (2) für BBoxen behandelt. Zum Beispiel,

    an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1,
                      xytext=(30, 0), textcoords="offset points")
    

    ist identisch mit:

    an2 = ax.annotate("Test 2", xy=(1, 0.5), xycoords=an1.get_window_extent,
                      xytext=(30, 0), textcoords="offset points")
    
  4. Ein Paar Koordinatenspezifikationen – die erste für die x-Koordinate und die zweite für die y-Koordinate; z.B

    annotate("Test", xy=(0.5, 1), xycoords=("data", "axes fraction"))
    

    Hier steht 0,5 in Datenkoordinaten und 1 in normalisierten Achsenkoordinaten. Jede der Koordinatenangaben kann auch ein Künstler oder eine Transformation sein. Zum Beispiel,

    ../../_images/sphx_glr_annotate_simple_coord02_001.png
  5. Manchmal möchten Sie Ihre Anmerkung mit einigen "Offset-Punkten" versehen, nicht von dem kommentierten Punkt, sondern von einem anderen Punkt. text.OffsetFromist ein Helfer für solche Fälle.

    ../../_images/sphx_glr_annotate_simple_coord03_001.png

    Sie können sich dieses Beispiel zum Kommentieren von Diagrammen ansehen .

Verwenden von ConnectionPatch #

ConnectionPatchist wie eine Anmerkung ohne Text. Dies ist zwar annotate in den meisten Situationen ausreichend, ConnectionPatchaber nützlich, wenn Sie Punkte auf verschiedenen Achsen verbinden möchten.

from matplotlib.patches import ConnectionPatch
xy = (0.2, 0.2)
con = ConnectionPatch(xyA=xy, coordsA=ax1.transData,
                      xyB=xy, coordsB=ax2.transData)
fig.add_artist(con)

Der obige Code verbindet Punkt xy in den Datenkoordinaten von ax1mit Punkt xy in den Datenkoordinaten von ax2. Hier ist ein einfaches Beispiel.

../../_images/sphx_glr_connect_simple01_001.png

Hier haben wir das ConnectionPatchzur Abbildung (mit add_artist) und nicht zu einer der Achsen hinzugefügt: Dies stellt sicher, dass es über beiden Achsen gezeichnet wird, und ist auch erforderlich, wenn constrained_layout zum Positionieren der Achsen verwendet wird.

Fortgeschrittene Themen #

Zoomeffekt zwischen Achsen #

mpl_toolkits.axes_grid1.inset_locatordefiniert einige Patch-Klassen, die zum Verbinden zweier Achsen nützlich sind. Das Verständnis des Codes erfordert einige Kenntnisse des Transformationssystems von Matplotlib.

../../_images/sphx_glr_axes_zoom_effect_001.png

Benutzerdefinierten BoxStyle definieren #

Sie können einen benutzerdefinierten Boxstil verwenden. Der Wert für boxstylekann ein aufrufbares Objekt in den folgenden Formen sein:

def __call__(self, x0, y0, width, height, mutation_size,
             aspect_ratio=1.):
    '''
    Given the location and size of the box, return the path of
    the box around it.

      - *x0*, *y0*, *width*, *height* : location and size of the box
      - *mutation_size* : a reference scale for the mutation.
      - *aspect_ratio* : aspect-ratio for the mutation.
    '''
    path = ...
    return path

Hier ist ein vollständiges Beispiel.

../../_images/sphx_glr_custom_boxstyle01_001.png

Auf ähnliche Weise können Sie einen benutzerdefinierten ConnectionStyle und einen benutzerdefinierten ArrowStyle definieren. Sehen Sie sich den Quellcode von an lib/matplotlib/patches.pyund überprüfen Sie, wie jede Stilklasse definiert ist.

Galerie generiert von Sphinx-Gallery