Notiz
Klicken Sie hier , um den vollständigen Beispielcode herunterzuladen
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)
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 |
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 annotate
an die
Text
Instanz übergeben.
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.
text
nimmt 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_boxstyle
legt 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
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 #
annotate
zeichnet 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 annotate
fü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"),
)
Der Pfeil wird wie folgt gezeichnet:
Ein Pfad, der die beiden Punkte verbindet, wird erstellt, wie durch den connectionstyle -Parameter angegeben.
Der Pfad wird abgeschnitten, um die Patches patchA und patchB zu vermeiden , falls diese gesetzt sind.
Der Pfad wird weiter durch ShrinkA und ShrinkB (in Pixeln) geschrumpft.
Der Pfad wird in ein Pfeilfeld umgewandelt , wie durch den Pfeilstil- Parameter angegeben.
Die Erstellung des Verbindungspfades zwischen zwei Punkten wird per
connectionstyle
Taste 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 angle3
und arc3
anzeigen 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 bar
Stils ist derzeit nicht gut definiert, es kann in Zukunft geändert werden).
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
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.
Wie bei kann mit dem Argument bboxtext
ein Rahmen um den Text gezogen werden
.
Standardmäßig ist der Startpunkt auf die Mitte der Textausdehnung festgelegt. Dies kann mit relpos
Schlü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.
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 OffsetBox
Klasse erstellt werden. Einige vordefinierte Klassen sind in matplotlib.offsetbox
und 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)
<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)
<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
AnchoredAuxTransformBox
Klasse verwenden. Dies ist ähnlich,
AnchoredDrawingArea
auß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)
<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).
Beachten Sie, dass im Gegensatz zur Legende die bbox_transform
standardmäß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
Eine
Transform
Instanz. 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="->"))
Eine
Artist
Instanz. 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="->"))
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 .
Transform
Ein aufrufbares Objekt, das die Renderer-Instanz als einzelnes Argument akzeptiert und entweder a oder a zurückgibtBboxBase
. 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")
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,
Manchmal möchten Sie Ihre Anmerkung mit einigen "Offset-Punkten" versehen, nicht von dem kommentierten Punkt, sondern von einem anderen Punkt.
text.OffsetFrom
ist ein Helfer für solche Fälle.Sie können sich dieses Beispiel zum Kommentieren von Diagrammen ansehen .
Verwenden von ConnectionPatch #
ConnectionPatch
ist wie eine Anmerkung ohne Text. Dies ist zwar annotate
in den meisten Situationen ausreichend, ConnectionPatch
aber 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 ax1
mit Punkt xy in den Datenkoordinaten von ax2
. Hier ist ein einfaches Beispiel.
Hier haben wir das ConnectionPatch
zur 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_locator
definiert einige Patch-Klassen, die zum Verbinden zweier Achsen nützlich sind. Das Verständnis des Codes erfordert einige Kenntnisse des Transformationssystems von Matplotlib.
Benutzerdefinierten BoxStyle definieren #
Sie können einen benutzerdefinierten Boxstil verwenden. Der Wert für boxstyle
kann 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.
Auf ähnliche Weise können Sie einen benutzerdefinierten ConnectionStyle und einen benutzerdefinierten ArrowStyle definieren. Sehen Sie sich den Quellcode von an lib/matplotlib/patches.py
und überprüfen Sie, wie jede Stilklasse definiert ist.