python matplotlib

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



(2)

Con un marco de datos y una trama 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()

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


Para anotar un punto, use ax.annotate() . En este caso, tiene sentido especificar las coordenadas para 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 ser el lado derecho de los ejes (es decir, 1 en coordenadas de ejes). Es posible que también desee compensar un poco el texto para 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()


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()

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 acercarlo para acercarlo. o más lejos como mejor le parezca.

MÉTODO 2 :

También puede usar el eje y derecho y etiquetarlo con sus 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 trama: