Matplotlib: puntos de etiquetado (x, y) en una línea con un valor z

Estoy tratando de hacer una ttwig 2d usando pyplot. Estoy leyendo en un archivo con varias columnas, cada una de las cuales contiene alrededor de 100 valores entre 1 y 10. Estoy trazando la columna 5 contra la columna 6, lo cual está bien.

Lo que también quiero hacer es etiquetar la línea resultante con valores enteros de la columna 0. Por lo tanto, la línea tendrá 11 puntos, en las posiciones (x, y) donde la columna 0 es un número entero. También me gustaría que esos puntos fueran etiquetados con ese entero.

Realmente agradecería cualquier ayuda con esto, me está volviendo loco!

De tu pregunta, no estoy 100% claro exactamente lo que quieres hacer.

¿Quieres etiquetar cada vértice en una línea? ¿O solo quieres etiquetar los vértices que son enteros? ¿O quiere interpolar donde los “cruces” enteros se alinearían a lo largo de la línea y los etiquetarían?

En primer lugar, para cargar su archivo de texto, busque en numpy.loadtxt , si aún no lo ha hecho. En tu caso particular, podrías hacer algo como:

 z, x, y = np.loadtxt('data.txt', usecols=[0, 5, 6]).T 

En cualquier caso, como ejemplo rápido de la opción más simple (etiquetar cada vértice):

 import numpy as np import matplotlib.pyplot as plt x = np.arange(10) y = 2 * x z = x ** 2 fig, ax = plt.subplots() ax.plot(x, y, 'bo-') for X, Y, Z in zip(x, y, z): # Annotate the points 5 _points_ above and to the left of the vertex ax.annotate('{}'.format(Z), xy=(X,Y), xytext=(-5, 5), ha='right', textcoords='offset points') plt.show() 

introduzca la descripción de la imagen aquí

Ahora, para la segunda opción, podríamos tener algo más como esto (Similar a lo que sugirió @ math.coffee):

 import numpy as np import matplotlib.pyplot as plt x = np.arange(-0.6, 5.6, 0.2) y = 2 * x z = x**2 fig, ax = plt.subplots() ax.plot(x, y, 'bo-') # Note the threshold... I'm assuming you want 1.000001 to be considered an int. # Otherwise, you'd use "z % 1 == 0", but beware exact float comparisons!! integers = z % 1 < 1e-6 for (X, Y, Z) in zip(x[integers], y[integers], z[integers]): ax.annotate('{:.0f}'.format(Z), xy=(X,Y), xytext=(-10, 10), ha='right', textcoords='offset points', arrowprops=dict(arrowstyle='->', shrinkA=0)) plt.show() 

introduzca la descripción de la imagen aquí