2011-06-11 18 views
5

Estoy dibujando un gráfico con algunas líneas usando matplotlib y quiero mostrar el valor final y junto a donde cada línea termina en el lado derecho de esta manera: enter image description hereMuestra el valor final del eje y de cada línea con matplotlib

¿Alguna solución o puntero a las partes relevantes de la API? Estoy bastante perplejo.

Estoy usando matplotlib 1.0.0 y la interfaz de pyplot, p. pyplot.plot(xs, ys, f, xs_, ys_, f_).

+0

Gracias para la edición de imágenes incrustar! – PAG

Respuesta

4

Opción 1 - pyplot.text

pyplot.text(x, y, string, fontdict=None, withdash=False, **kwargs) 

Opción 2 - Utilice un second axes:

second_axes = pyplot.twinx() # create the second axes, sharing x-axis 
second_axis.set_yticks([0.2,0.4]) # list of your y values 
pyplot.show() # update the figure 
+0

La primera opción hace el trabajo (sobre todo, mira mi comentario anterior) ¡pero me gusta mucho el segundo! Tiene que configurar el mismo formateador de ejes a mano, pero eso no es problema. ¡Gracias! – PAG

+0

Sin embargo, tiene cierta dificultad cuando el eje y es la escala logarítmica. Los números se dibujan como si el nuevo eje no. Si el segundo eje y está configurado para registrar la escala también, los números no se dibujan. – PAG

10

Si bien no hay nada malo con la respuesta de Ofri, annotate está destinado especialmente para este propósito:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(61).astype(np.float) 
y1 = np.exp(0.1 * x) 
y2 = np.exp(0.09 * x) 

plt.plot(x, y1) 
plt.plot(x, y2) 

for var in (y1, y2): 
    plt.annotate('%0.2f' % var.max(), xy=(1, var.max()), xytext=(8, 0), 
       xycoords=('axes fraction', 'data'), textcoords='offset points') 

plt.show() 

enter image description here

Esto coloca el texto 8 puntos a la derecha de la parte derecha del eje, en el valor de y máximo para cada trama. También puede agregar flechas, etc. Consulte http://matplotlib.sourceforge.net/users/annotations_guide.html (También puede cambiar la alineación vertical, si desea que el texto se centre verticalmente en el valor y especificado. Simplemente especifique va='center')

Además, esto no se basa en las ubicaciones de ticks, por lo que funcionará perfectamente para los diagramas de registro, etc. Dar la ubicación del texto en términos de las posiciones de los límites de los ejes y su desplazamiento en puntos tiene muchas ventajas si comienza a redimensionar el trazado, etc.

+2

Gracias, eso es muy útil. – PAG

1

Muy útil Joe. Solo un detalle más. Si el valor final no es un máximo, puede usar y [-1]. Agregué una línea horizontal para aclarar.

gbm = np.log(np.cumsum(np.random.randn(10000))+10000) 
plt.plot(gbm) 
plt.annotate('%0.2f' % gbm[-1], xy=(1, gbm[-1]), xytext=(8, 0), 
      xycoords=('axes fraction', 'data'), textcoords='offset points') 
plt.axhline(y=gbm[-1], color='y', linestyle='-.') 
plt.show() 

Plot with final y-axis value marked.

Cuestiones relacionadas