Введення тексту в лівий верхній кут сюжету matplotlib


112

Як я можу помістити текст у верхній лівий (або верхній правий) кут фігури matplotlib, наприклад, де була б ліва верхня легенда, або зверху сюжету, але у верхньому лівому куті? Наприклад, якщо це plt.scatter (), то щось, що було б у квадраті розкиду, поставити у верхньому лівому верхньому куті.

Я хотів би зробити це, не в ідеалі знаючи масштаб плану, який планується, наприклад, оскільки він зміниться від набору даних до набору даних. Я просто хочу, щоб текст знаходився приблизно в лівій верхній частині або приблизно в верхньому правому куті. При позиціонуванні типу легенди воно все одно не повинно перетинатися з будь-якими точками розкидання сюжету.

Дякую!


Якщо ви хочете помістити текст у поле stackoverflow.com/questions/20842613/…
raphael

1
Я б подумав, що це дублікат цього питання . На запитання, що повторюється, є навіть набагато кращі відповіді, хоча відповідь, наданий тут (використовуючи textта ax.transAxes), не є серед них.
ВажливістьOfBeingErnest

Відповіді:


162

Можна використовувати text.

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

text координати можуть бути задані відносно осі, тож положення вашого тексту буде незалежним від розміру сюжету:

Перетворення за замовчуванням визначає, що текст знаходиться в кодах даних, або ви можете вказати текст у косах осей (0,0 - ліворуч і 1,1 - праворуч). Приклад нижче розміщує текст у центрі осей ::

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

Щоб запобігти втручанню тексту в будь-яку точку розсіювання, це складніше афаїка. Найпростіший метод - встановити y_axis (ymax в ylim((ymin,ymax))) значення трохи вище, ніж максимум y-координати ваших точок. Таким чином у вас завжди буде вільний простір для тексту.

EDIT: ось у вас приклад:

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

введіть тут опис зображення

Параметри ha і va встановлюють вирівнювання тексту щодо точки вставки. тобто. ha = 'зліва' - це гарний набір для запобігання виходу довгого тексту з лівої осі, коли рамка скорочується (звужується) вручну.


Я отримую центрування, але як я можу зробити це топлефтом? Я спробував "horizontalalignment" встановити на "left", а verticalalignment встановити вгорі, але це не працює

1
Ви повинні грати зі значеннями x, y, як зазначено ( 0,0 - ліворуч і 1,1 - праворуч ). Дивіться редагування
joaquin

2
@ user3645626 Імпорт: from pylab import figure, text, scatter, show Код у відповіді виконувався на консолі ipython в режимі pylab, де явний імпорт не був необхідним. У чистому середовищі вам потрібно імпортувати вищезазначене та зробити show()перегляд сюжету
Joaquin

5

Одним з рішень було б використання plt.legendфункції, навіть якщо ви не хочете фактичної легенди. Ви можете вказати розміщення поля легенди за допомогою locклавіші. Більше інформації можна знайти на цьому веб-сайті, але я також включив приклад, який показує, як розмістити легенду:

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) 

Зауважте, що так loc=2, легенда знаходиться у лівому верхньому куті сюжету. І якщо текст перекриється з сюжетом, ви можете зробити його меншим за допомогою legend.fontsize, що потім зробить легенду меншою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.