Text in die obere linke Ecke des Matplotlib-Diagramms einfügen

112

Wie kann ich Text in die obere linke (oder obere rechte) Ecke einer Matplotlib-Figur einfügen, z. B. wo sich eine Legende oben links befindet, oder über die Handlung, aber in die obere linke Ecke? Wenn es sich beispielsweise um eine plt.scatter () handelt, wird etwas, das sich innerhalb des Quadrats der Streuung befindet, in der oberen linken Ecke platziert.

Ich möchte dies tun, ohne im Idealfall den Maßstab des zu plottenden Streudiagramms zu kennen, da es sich von Datensatz zu Datensatz ändert. Ich möchte nur, dass der Text ungefähr oben links oder ungefähr oben rechts ist. Bei der Positionierung vom Legendentyp sollte es ohnehin nicht mit Streudiagrammpunkten überlappen.

Vielen Dank!


quelle
Wenn Sie Ihren Text in eine Box stapeln
möchten
1
Ich würde denken, dass dies ein Duplikat dieser Frage ist . Die doppelte Frage hat sogar viel bessere Antworten, obwohl die hier bereitgestellte Antwort (mit textund ax.transAxes) nicht dazu gehört.
ImportanceOfBeingErnest

Antworten:

162

Sie können verwenden text.

text(x, y, s, fontsize=12)

text Koordinaten können relativ zur Achse angegeben werden, sodass die Position Ihres Textes unabhängig von der Größe des Diagramms ist:

Die Standardtransformation gibt an, dass sich Text in Datenkoordinaten befindet. Alternativ können Sie Text in Achsenkoordinaten angeben (0,0 ist unten links und 1,1 ist oben rechts). Im folgenden Beispiel wird Text in der Mitte der Achsen platziert:

text(0.5, 0.5,'matplotlib',
     horizontalalignment='center',
     verticalalignment='center',
     transform = ax.transAxes)

Es ist schwieriger, zu verhindern, dass der Text einen Punkt Ihrer Streuung stört. Die einfachere Methode besteht darin, y_axis (ymax in ylim((ymin,ymax))) auf einen Wert zu setzen, der etwas höher ist als die maximale y-Koordinate Ihrer Punkte. Auf diese Weise haben Sie immer diesen freien Platz für den Text.

EDIT: hier hast du ein Beispiel:

In [17]: from pylab import figure, text, scatter, show
In [18]: f = figure()
In [19]: ax = f.add_subplot(111)
In [20]: scatter([3,5,2,6,8],[5,3,2,1,5])
Out[20]: <matplotlib.collections.CircleCollection object at 0x0000000007439A90>
In [21]: text(0.1, 0.9,'matplotlib', ha='center', va='center', transform=ax.transAxes)
Out[21]: <matplotlib.text.Text object at 0x0000000007415B38>
In [22]:

Geben Sie hier die Bildbeschreibung ein

Die Parameter ha und va legen die Ausrichtung Ihres Textes relativ zur Einfügemarke fest. dh. ha = 'left' ist eine gute Einstellung, um zu verhindern, dass ein langer Text aus der linken Achse austritt, wenn der Rahmen manuell verkleinert (verengt) wird.

Joaquin
quelle
Ich bekomme die Zentrierung, aber wie kann ich es oben links machen? Ich habe versucht, "horizontale
1
Sie müssen wie angegeben mit x- und y-Werten spielen ( 0,0 ist unten links und 1,1 ist oben rechts ). Siehe edit
joaquin
2
@ user3645626 Importe sind: from pylab import figure, text, scatter, show Code in der Antwort wurde in einer Ipython-Konsole im Pylab-Modus ausgeführt, in der explizite Importe nicht erforderlich waren. Auf einer sauberen Umgebung müssen Sie das oben genannte importieren und machen show(), um die Handlung
anzuzeigen
5

Eine Lösung wäre, die plt.legendFunktion zu verwenden, auch wenn Sie keine tatsächliche Legende möchten. Sie können die Platzierung des Legendenfelds mithilfe des locSchlüsselworts festlegen. Weitere Informationen finden Sie auf dieser Website, aber ich habe auch ein Beispiel beigefügt, das zeigt, wie eine Legende platziert wird:

ax.scatter(xa,ya, marker='o', s=20, c="lightgreen", alpha=0.9)
ax.scatter(xb,yb, marker='o', s=20, c="dodgerblue", alpha=0.9)
ax.scatter(xc,yc marker='o', s=20, c="firebrick", alpha=1.0)
ax.scatter(xd,xd,xd, marker='o', s=20, c="goldenrod", alpha=0.9)
line1 = Line2D(range(10), range(10), marker='o', color="goldenrod")
line2 = Line2D(range(10), range(10), marker='o',color="firebrick")
line3 = Line2D(range(10), range(10), marker='o',color="lightgreen")
line4 = Line2D(range(10), range(10), marker='o',color="dodgerblue")
plt.legend((line1,line2,line3, line4),('line1','line2', 'line3', 'line4'),numpoints=1, loc=2) 

Beachten Sie, dass sich loc=2die Legende in der oberen linken Ecke des Diagramms befindet. Und wenn sich der Text mit dem Plot überschneidet, können Sie ihn mithilfe von verkleinern legend.fontsize, wodurch die Legende kleiner wird.

Kosmose
quelle