¿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.
aetodd
fuente

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='--')
Tacaswell
fuente
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='-')
zbinsd
fuente
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í

Roman Orac
fuente
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

Trenton McKinney
fuente
¿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