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

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

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

Благодарность!


person Community    schedule 12.12.2011    source источник
comment
Если вы хотите поместить свой текст в поле stackoverflow.com/questions/20842613/   -  person raphael    schedule 06.10.2016
comment
Я думаю, что это дубликат этого вопроса. На повторяющийся вопрос даже есть гораздо лучшие ответы, хотя приведенный здесь ответ (с использованием text и ax.transAxes) среди них отсутствует.   -  person ImportanceOfBeingErnest    schedule 01.09.2017


Ответы (3)


Вы можете использовать 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 ваших точек. Таким образом, у вас всегда будет свободное место для текста.

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

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

person joaquin    schedule 12.12.2011
comment
Я получил центрирование, но как я могу сделать его верхним? Я попробовал установить горизонтальное выравнивание влево и вертикальное выравнивание вверху, но это не работает. - person ; 13.12.2011
comment
вы должны играть со значениями x, y, как указано (0,0 - нижний левый, а 1,1 - верхний правый). См. Править - person joaquin; 13.12.2011
comment
@ user3645626 Импорты: from pylab import figure, text, scatter, show Код в ответе был выполнен в консоли ipython в режиме pylab, где явный импорт не требовался. В чистой среде вам нужно импортировать вышеуказанное и сделать show() для просмотра сюжета. - person joaquin; 03.09.2015

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

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

person Trenton McKinney    schedule 13.08.2020

Одним из решений было бы использование функции 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, что затем сделает легенду меньше.

person cosmosis    schedule 13.12.2011