Etiquetar puntos de datos en el gráfico

Resuelto ashley asked hace 10 años • 3 respuestas

Si desea etiquetar los puntos de su trama usando python matplotlib, utilicé el siguiente código.

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = anyarray
B = anyotherarray

plt.plot(A,B)
for i,j in zip(A,B):
    ax.annotate('%s)' %j, xy=(i,j), xytext=(30,0), textcoords='offset points')
    ax.annotate('(%s,' %i, xy=(i,j))

plt.grid()
plt.show()

Sé que eso xytext=(30,0)va junto con textcoordsy usas esos valores 30,0 para colocar el punto de la etiqueta de datos, de modo que esté en y=0y x=30en su propia pequeña área.

Necesita trazar ambas líneas iy, jde lo contrario, solo trazará xo yetiquetará los datos.

Obtendrá algo como esto (tenga en cuenta solo las etiquetas):

Mi propio gráfico con puntos de datos etiquetados

No es lo ideal, todavía hay cierta superposición.

ashley avatar Mar 08 '14 23:03 ashley
Aceptado

¿Qué tal imprimir (x, y)de una vez?

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

ax.plot(A,B)
for xy in zip(A, B):                                       # <--
    ax.annotate('(%s, %s)' % xy, xy=xy, textcoords='data') # <--

ax.grid()
plt.show()

ingrese la descripción de la imagen aquí

falsetru avatar Mar 08 '2014 17:03 falsetru

Tuve un problema similar y terminé con esto:

ingrese la descripción de la imagen aquí

Para mí, esto tiene la ventaja de que los datos y las anotaciones no se superponen.

from matplotlib import pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

plt.plot(A,B)

# annotations at the side (ordered by B values)
x0,x1=ax.get_xlim()
y0,y1=ax.get_ylim()
for ii, ind in enumerate(np.argsort(B)):
    x = A[ind]
    y = B[ind]
    xPos = x1 + .02 * (x1 - x0)
    yPos = y0 + ii * (y1 - y0)/(len(B) - 1)
    ax.annotate('',#label,
          xy=(x, y), xycoords='data',
          xytext=(xPos, yPos), textcoords='data',
          arrowprops=dict(
                          connectionstyle="arc3,rad=0.",
                          shrinkA=0, shrinkB=10,
                          arrowstyle= '-|>', ls= '-', linewidth=2
                          ),
          va='bottom', ha='left', zorder=19
          )
    ax.text(xPos + .01 * (x1 - x0), yPos,
            '({:.2f}, {:.2f})'.format(x,y),
            transform=ax.transData, va='center')

plt.grid()
plt.show()

El uso del argumento de texto .annotateterminó con posiciones de texto desfavorables. Dibujar líneas entre una leyenda y los puntos de datos es un desastre, ya que es difícil abordar la ubicación de la leyenda.

Markus Dutschke avatar Jul 11 '2019 11:07 Markus Dutschke

Si no se necesitan flechas, text()también se pueden utilizar para etiquetar puntos.

import matplotlib.pyplot as plt

A = [-0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0]
B = [0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54]

fig, ax = plt.subplots()
ax.plot(A,B)

for x, y in zip(A, B):
    ax.text(x, y, f"({x}, {y})", fontsize=8)

trama1


También puede anotar algunos puntos o cambiar la posición de las etiquetas en relación con el punto anotando puntos condicionalmente. Además, puede asignar etiquetas arbitrarias.

Por ejemplo, el siguiente código dibuja las etiquetas en el lado izquierdo del punto si x>0y en el lado derecho en caso contrario. Además, annotate()admite kwargs adicionales que se pueden utilizar para embellecer las etiquetas.

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54
labels = 'ABCDEFG'

fig, ax = plt.subplots()
ax.plot(A,B)

# annotator function that draws a label and an arrow 
# that points from the label to its corresponding point
def annotate(ax, label, x, y, xytext):
    ax.annotate(label, xy=(x,y), 
                xytext=xytext, textcoords='offset points', 
                fontsize=15, 
                arrowprops={'arrowstyle': '-|>', 'color': 'black'})

# conditionally position labels
for label, x, y in zip(labels, A, B):
    if y > 0.9:
        annotate(ax, label, x, y, (-5, -40))
    else:
        annotate(ax, label, x, y, (-5, 30))

trama2

cottontail avatar Apr 25 '2023 03:04 cottontail