Помещение текста в верхний левый угол графика matplotlib


112

Как я могу поместить текст в верхний левый (или верхний правый) угол рисунка matplotlib, например, там, где будет верхняя левая легенда, или поверх графика, но в верхнем левом углу? Например, если это plt.scatter (), то что-то, что находится в квадрате разброса, помещается в самый верхний левый угол.

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

Спасибо!


Если вы хотите поместить свой текст в поле, stackoverflow.com/questions/20842613/…
raphael

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

Ответы:


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 in ylim((ymin,ymax))) на значение немного выше, чем максимальная координата y ваших точек. Таким образом, у вас всегда будет свободное место для текста.

РЕДАКТИРОВАТЬ: вот пример:

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 = 'left' - хороший набор для предотвращения выхода длинного текста за левую ось при уменьшении (сужении) рамки вручную.


Я получаю центрирование, но как я могу сделать его верхним? Я попробовал установить для «горизонтального

1
вы должны играть со значениями x, y, как указано ( 0,0 - это нижний левый угол, а 1,1 - верхний правый угол ). См. Править
Хоакин

2
@ user3645626 Импорты: from pylab import figure, text, scatter, show Код в ответе был выполнен в консоли ipython в режиме pylab, где явный импорт не требовался. В чистой среде вам нужно импортировать вышеупомянутое и сделать show()для просмотра сюжета
Хоакин

5

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

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, что затем уменьшит легенду.


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')

Выход обоих

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

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()

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.