Anote el final de las líneas usando python y matplotlib

Con un dataframe y una ttwig básica como esta:

import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(123456) rows = 75 df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 3)), columns=['A', 'B', 'C']) datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist() df['dates'] = datelist df = df.set_index(['dates']) df.index = pd.to_datetime(df.index) df = df.cumsum() df.plot() 

introduzca la descripción de la imagen aquí

¿Cuál es la mejor manera de anotar los últimos puntos en las líneas para que obtenga el resultado a continuación?

introduzca la descripción de la imagen aquí

Para anotar un punto use ax.annotate() . En este caso, tiene sentido especificar las coordenadas a anotar por separado. Es decir, la coordenada y es la coordenada de datos del último punto de la línea (que puede obtener de line.get_ydata()[-1] ) mientras que la coordenada x es independiente de los datos y debe estar en el lado derecho de los ejes. (es decir, 1 en coordenadas de ejes). También es posible que desee desplazar el texto un poco de modo que no se superponga con los ejes.

 import pandas as pd import numpy as np import matplotlib.pyplot as plt rows = 75 df = pd.DataFrame(np.random.randint(-4,5,size=(rows, 3)), columns=['A', 'B', 'C']) datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist() df['dates'] = datelist df = df.set_index(['dates']) df.index = pd.to_datetime(df.index) df = df.cumsum() ax = df.plot() for line, name in zip(ax.lines, df.columns): y = line.get_ydata()[-1] ax.annotate(name, xy=(1,y), xytext=(6,0), color=line.get_color(), xycoords = ax.get_yaxis_transform(), textcoords="offset points", size=14, va="center") plt.show() 

introduzca la descripción de la imagen aquí

Método 1

Aquí hay una forma, o al menos un método, que puede adaptar para adaptarse estéticamente de la forma que desee, utilizando el método plt.annotate :

[EDITAR]: Si va a utilizar un método como este primero, el método descrito en la respuesta de ImportanceOfBeingErnest es mejor de lo que he propuesto.

 df.plot() for col in df.columns: plt.annotate(col,xy=(plt.xticks()[0][-1]+0.7, df[col].iloc[-1])) plt.show() 

Trama

Para el argumento xy , que son las coordenadas x e y del texto, elegí la última coordenada x en plt.xticks() , y agregué 0.7 para que esté fuera de su eje x, pero puede elegir para acercarlo o más lejos como mejor le parezca.

MÉTODO 2 :

También puedes usar el eje y correcto y etiquetarlo con tus 3 líneas. Por ejemplo:

 fig, ax = plt.subplots() df.plot(ax=ax) ax2 = ax.twinx() ax2.set_ylim(ax.get_ylim()) ax2.set_yticks([df[col].iloc[-1] for col in df.columns]) ax2.set_yticklabels(df.columns) plt.show() 

Esto te da la siguiente ttwig:

plot2 anotado y