Umieszczanie tekstu w lewym górnym rogu wykresu matplotlib

112

Jak mogę umieścić tekst w lewym górnym (lub prawym górnym) rogu figury matplotlib, np. Tam, gdzie byłaby legenda w lewym górnym rogu, lub na górze wykresu, ale w lewym górnym rogu? Np. Jeśli jest to plt.scatter (), to coś, co będzie w kwadracie scatter, umieść w lewym górnym rogu.

Chciałbym to zrobić bez idealnej znajomości na przykład skali wykreślanego wykresu rozrzutu, ponieważ zmieni się on ze zbioru danych do zbioru danych. Chcę tylko, żeby tekst był mniej więcej w lewym górnym rogu lub mniej więcej w prawym górnym rogu. W przypadku pozycjonowania typu legendy i tak nie powinien on nakładać się na żadne punkty wykresu punktowego.

dzięki!


źródło
Jeśli chcesz umieścić swój tekst w pudełku stackoverflow.com/questions/20842613/ ...
raphael
1
Myślę, że jest to powtórzenie tego pytania . Zduplikowane pytanie ma nawet znacznie lepsze odpowiedzi, chociaż rodzaj odpowiedzi tutaj (używając texti ax.transAxes) nie jest wśród nich.
ImportanceOfBeingErnest

Odpowiedzi:

162

Możesz użyć text.

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

text współrzędne można podać względem osi, więc pozycja tekstu będzie niezależna od rozmiaru wykresu:

Domyślna transformacja określa, że ​​tekst jest we współrzędnych danych, alternatywnie można określić tekst we współrzędnych osi (0,0 to lewy dolny róg, a 1,1 prawy górny). Poniższy przykład umieszcza tekst w środku osi:

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

Zapobieganie kolidowaniu tekstu z dowolnym punktem rozproszenia jest trudniejsze. Łatwiejszą metodą jest ustawienie wartości y_axis (ymax in ylim((ymin,ymax))) na wartość nieco wyższą niż maksymalna współrzędna y punktów. W ten sposób zawsze będziesz mieć wolne miejsce na tekst.

EDYCJA: tutaj masz przykład:

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]:

wprowadź opis obrazu tutaj

Parametry ha i va określają wyrównanie tekstu względem punktu wstawiania. to znaczy. ha = 'left' to dobry zestaw, aby zapobiec wychodzeniu długiego tekstu z lewej osi, gdy ramka jest zmniejszana (zwężana) ręcznie.

joaquin
źródło
Uzyskuje się wyśrodkowanie, ale jak mogę ustawić je na górze w lewo? Próbowałem ustawić „
1
musisz grać z wartościami x, y jak wskazano ( 0,0 to lewy dolny róg, a 1,1 górny prawy ). Zobacz edycję
joaquin
2
@ user3645626 Importy to: from pylab import figure, text, scatter, show Kod w odpowiedzi został wykonany w konsoli ipython w trybie pylab, gdzie jawne importy nie były konieczne. W czystym środowisku musisz zaimportować powyższe i show()wyświetlić działkę
joaquin
5

Jednym z rozwiązań byłoby użycie tej plt.legendfunkcji, nawet jeśli nie chcesz prawdziwej legendy. Możesz określić położenie pola legendy, używając locterminu kluczowania. Więcej informacji można znaleźć na tej stronie, ale zamieściłem również przykład pokazujący, jak umieścić legendę:

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) 

Zauważ, że ponieważ loc=2legenda znajduje się w lewym górnym rogu wykresu. A jeśli tekst nakłada się na wykres, możesz go zmniejszyć, używając legend.fontsize, co spowoduje zmniejszenie legendy.

kosmoza
źródło
0
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 6))
plt.text(0.1, 0.9, 'text', size=15, color='purple')

# or 

fig, axe = plt.subplots(figsize=(6, 6))
axe.text(0.1, 0.9, 'text', size=15, color='purple')

Wyjście obu

wprowadź opis obrazu tutaj

import matplotlib.pyplot as plt

# Build a rectangle in axes coords
left, width = .25, .5
bottom, height = .25, .5
right = left + width
top = bottom + height
ax = plt.gca()
p = plt.Rectangle((left, bottom), width, height, fill=False)
p.set_transform(ax.transAxes)
p.set_clip_on(False)
ax.add_patch(p)


ax.text(left, bottom, 'left top',
        horizontalalignment='left',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, bottom, 'left bottom',
        horizontalalignment='left',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right bottom',
        horizontalalignment='right',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.text(right, top, 'right top',
        horizontalalignment='right',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(right, bottom, 'center top',
        horizontalalignment='center',
        verticalalignment='top',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'right center',
        horizontalalignment='right',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, 0.5 * (bottom + top), 'left center',
        horizontalalignment='left',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(0.5 * (left + right), 0.5 * (bottom + top), 'middle',
        horizontalalignment='center',
        verticalalignment='center',
        transform=ax.transAxes)

ax.text(right, 0.5 * (bottom + top), 'centered',
        horizontalalignment='center',
        verticalalignment='center',
        rotation='vertical',
        transform=ax.transAxes)

ax.text(left, top, 'rotated\nwith newlines',
        horizontalalignment='center',
        verticalalignment='center',
        rotation=45,
        transform=ax.transAxes)

plt.axis('off')

plt.show()

wprowadź opis obrazu tutaj

Trenton McKinney
źródło