¿Cómo trazas una línea vertical en una gráfica de series de tiempo en Pandas?


81
  • ¿Cómo traza una línea vertical ( vlines) en un gráfico de la serie Pandas?
  • Estoy usando Pandas para trazar medios rodantes, etc., y me gustaría marcar posiciones importantes con una línea vertical.
  • ¿Es posible usar vlines, o algo similar, para lograr esto?
  • En este caso, el eje x es datetime.

Respuestas:


110
plt.axvline(x_position)

Se necesita la trama estándar de opciones de formato ( linestlye, color, etc.)

(Doc)

Si tiene una referencia a su axesobjeto:

ax.axvline(x, color='k', linestyle='--')

3
Sí, tiene acceso al objeto axes ax = s.plot (), donde s es un pandas.Series
joao

41

Si tiene un eje de tiempo y tiene Pandas importados como pd, puede usar:

ax.axvline(pd.to_datetime('2015-11-01'), color='r', linestyle='--', lw=2)

Para múltiples líneas:

xposition = [pd.to_datetime('2010-01-01'), pd.to_datetime('2015-12-31')]
for xc in xposition:
    ax.axvline(x=xc, color='k', linestyle='-')

Tengo una trama de 3 días y todo lo que hice fue: xposition = [pd.to_datetime('01/04/2016'), pd.to_datetime('02/04/2016'),pd.to_datetime('03/04/2016')]entonces for xc in xposition: ax.axvline(x=xc, color='k', linestyle='-'). Y tengo: ValueError: ordinal must be >= 1.. ¿Qué pasa?
FaCoffee

@FaCoffee, sus fechas están en un formato diferente al del ejemplo dado en la respuesta, aunque no veo cómo eso haría la diferencia.
RufusVS

Me gustaría trazar una línea vertical en un gráfico de columnas de series de tiempo para cada día, ¿alguna ayuda, por favor?
Ikbel benab

12

La función de trazado de DataFrame devuelve el AxesSubplotobjeto y en él, puede agregar tantas líneas como desee. Eche un vistazo al ejemplo de código a continuación:

%matplotlib inline

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range("2019-07-01", "2019-07-31"))  # for sample data only
df["y"] = np.logspace(0, 1, num=len(df))  # for sample data only

ax = df.plot()
# you can add here as many lines as you want
ax.axhline(6, color="red", linestyle="--")
ax.axvline("2019-07-24", color="red", linestyle="--")

ingrese la descripción de la imagen aquí


2

matplotlib.pyplot.vlines

  • Para una serie de tiempo, las fechas del eje deben ser objetos de fecha y hora adecuados , no cadenas.
  • Permite ubicaciones únicas o múltiples
  • ymin& ymaxse especifican como un valor y específico, no como un porcentaje deylim
  • Si hace referencia axescon algo como fig, axes = plt.subplots(), cambie plt.xlinesaaxes.xlines

plt.plot() Y sns.lineplot()

from datetime import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # if using seaborn

plt.style.use('seaborn')  # these plots use this style

# configure synthetic dataframe
df = pd.DataFrame(index=pd.bdate_range(datetime(2020, 6, 8), freq='1d', periods=500).tolist())
df['v'] = np.logspace(0, 1, num=len(df))

# plot
plt.plot('v', data=df, color='magenta')

y_min = df.v.min()
y_max = df.v.max()

plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
plt.vlines(x=datetime(2021, 9, 14), ymin=4, ymax=9, colors='green', ls=':', lw=2, label='vline_single')
plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
plt.show()

ingrese la descripción de la imagen aquí

df.plot()

df.plot(color='magenta')

ticks, _ = plt.xticks()
print(f'Date format is pandas api format: {ticks}')

y_min = df.v.min()
y_max = df.v.max()

plt.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')
plt.vlines(x='2020-12-25', ymin=y_min, ymax=8, colors='green', ls=':', lw=2, label='vline_single')
plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left")
plt.show()

ingrese la descripción de la imagen aquí

versiones del paquete

import matplotlib as mpl

print(mpl.__version__)
print(sns.__version__)
print(pd.__version__)

[out]:
3.3.1
0.10.1
1.1.0


¿Cómo agregaste el fondo gris con la cuadrícula blanca? No puedo descifrarlo del código
blkpingu

1
plt.style.use('seaborn')
Trenton McKinney
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.