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: