Colocando texto no canto superior esquerdo do gráfico matplotlib

112

Como posso colocar texto no canto superior esquerdo (ou superior direito) de uma figura matplotlib, por exemplo, onde uma legenda superior esquerda estaria, ou no topo do gráfico, mas no canto superior esquerdo? Por exemplo, se for um plt.scatter (), então algo que estaria dentro do quadrado da dispersão, coloque no canto superior esquerdo.

Eu gostaria de fazer isso sem saber idealmente a escala do gráfico de dispersão sendo plotado, por exemplo, uma vez que ele mudará de conjunto de dados para conjunto de dados. Eu só quero que o texto esteja aproximadamente no canto superior esquerdo ou aproximadamente no canto superior direito. Com o posicionamento do tipo de legenda, ele não deve se sobrepor a nenhum ponto do gráfico de dispersão.

obrigado!


fonte
Se você quiser colocar seu texto em uma caixa stackoverflow.com/questions/20842613/…
raphael
1
Eu acho que esta é uma duplicata desta pergunta . A pergunta duplicada ainda tem respostas muito melhores, embora o tipo de resposta fornecida aqui (usando texte ax.transAxes) não esteja entre elas.
ImportanceOfBeingErnest

Respostas:

162

Você pode usar text.

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

text as coordenadas podem ser fornecidas em relação ao eixo, de modo que a posição do seu texto será independente do tamanho do gráfico:

A transformação padrão especifica que o texto está em coordenadas de dados, como alternativa, você pode especificar o texto em coordenadas de eixo (0,0 é inferior esquerdo e 1,1 é superior direito). O exemplo abaixo coloca o texto no centro dos eixos:

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

Para evitar que o texto interfira em algum ponto de sua dispersão é mais difícil afaik. O método mais fácil é definir o eixo y (ymax em ylim((ymin,ymax))) com um valor um pouco mais alto do que a coordenada y máxima de seus pontos. Desta forma, você sempre terá esse espaço livre para o texto.

EDITAR: aqui você tem um exemplo:

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

insira a descrição da imagem aqui

Os parâmetros ha e va definem o alinhamento do seu texto em relação ao ponto de inserção. ie. ha = 'left' é um bom conjunto para evitar que um texto longo saia do eixo esquerdo quando o quadro é reduzido (tornado mais estreito) manualmente.

joaquin
fonte
Eu consigo a centralização, mas como posso fazer com que seja tornada mais pesada? Eu tentei "
1
você deve jogar com os valores x, y conforme indicado ( 0,0 é inferior esquerdo e 1,1 é superior direito ). Ver editar
joaquin
2
@ user3645626 As importações são: O from pylab import figure, text, scatter, show código na resposta foi executado em um console ipython no modo pylab onde as importações explícitas não eram necessárias. Em um ambiente limpo, você precisa importar o texto acima e fazer show()para visualizar o enredo
joaquin
5

Uma solução seria usar a plt.legendfunção, mesmo se você não quiser uma legenda real. Você pode especificar o posicionamento da caixa de legenda usando o lockeyterm. Mais informações podem ser encontradas neste site, mas também incluí um exemplo que mostra como colocar uma legenda:

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) 

Observe que loc=2, porque , a legenda está no canto superior esquerdo do gráfico. E se o texto se sobrepõe ao gráfico, você pode diminuí-lo usando legend.fontsize, o que tornará a legenda menor.

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

Saída de ambos

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Trenton McKinney
fonte