Poner texto en la esquina superior izquierda del diagrama de matplotlib

112

¿Cómo puedo poner texto en la esquina superior izquierda (o superior derecha) de una figura de matplotlib, por ejemplo, donde estaría una leyenda superior izquierda, o en la parte superior del gráfico pero en la esquina superior izquierda? Por ejemplo, si es un plt.scatter (), entonces algo que estaría dentro del cuadrado del scatter, colóquelo en la esquina superior izquierda.

Me gustaría hacer esto sin saber idealmente la escala del diagrama de dispersión que se está trazando, por ejemplo, ya que cambiará de un conjunto de datos a otro. Solo quiero que el texto esté aproximadamente en la parte superior izquierda o aproximadamente en la parte superior derecha. De todos modos, con el posicionamiento del tipo de leyenda, no debe superponerse con ningún punto del gráfico de dispersión.

¡Gracias!


fuente
Si desea poner su texto en un cuadro stackoverflow.com/questions/20842613/…
raphael
1
Creo que esto es un duplicado de esta pregunta . La pregunta duplicada incluso tiene respuestas mucho mejores, aunque el tipo de respuesta proporcionada aquí (usando texty ax.transAxes) no se encuentra entre ellas.
ImportanceOfBeingErnest

Respuestas:

162

Puede utilizar text.

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

text las coordenadas se pueden dar en relación con el eje, por lo que la posición de su texto será independiente del tamaño del gráfico:

La transformación predeterminada especifica que el texto está en coordenadas de datos, alternativamente, puede especificar texto en coordenadas de eje (0,0 es inferior izquierda y 1,1 es superior derecha). El siguiente ejemplo coloca el texto en el centro de los ejes:

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

Evitar que el texto interfiera con cualquier punto de su dispersión es más difícil afaik. El método más fácil es establecer y_axis (ymax in ylim((ymin,ymax))) en un valor un poco más alto que la coordenada y máxima de sus puntos. De esta forma siempre tendrás este espacio libre para el texto.

EDITAR: aquí tienes un ejemplo:

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

ingrese la descripción de la imagen aquí

Los parámetros ha y va establecen la alineación de su texto en relación con el punto de inserción. es decir. ha = 'left' es un buen conjunto para evitar que un texto largo se salga del eje izquierdo cuando el marco se reduce (se hace más estrecho) manualmente.

Joaquín
fuente
Consigo el centrado, pero ¿cómo puedo hacerlo por completo? Intenté "
1
debes jugar con los valores x, y como se indica ( 0,0 es la parte inferior izquierda y 1,1 es la parte superior derecha ). Ver editar
joaquin
2
@ user3645626 Las importaciones son: El from pylab import figure, text, scatter, show código de la respuesta se ejecutó en una consola ipython en modo pylab donde las importaciones explícitas no eran necesarias. En un entorno limpio, debe importar lo anterior y hacer show()para ver la trama
joaquin
5

Una solución sería usar la plt.legendfunción, incluso si no desea una leyenda real. Puede especificar la ubicación del cuadro de leyenda utilizando el término locclave. Se puede encontrar más información en este sitio web, pero también he incluido un ejemplo que muestra cómo colocar una leyenda:

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) 

Tenga en cuenta que porque loc=2la leyenda está en la esquina superior izquierda del gráfico. Y si el texto se superpone con la trama, puede hacerlo más pequeño usando legend.fontsize, lo que luego hará que la leyenda sea más pequeña.

cosmosis
fuente