102 votes

Comment tracez-vous une ligne verticale sur un graphique de séries chronologiques dans Pandas ?

  • Comment tracer une ligne verticale (vlines) dans un graphique de série Pandas?
  • Je suis en train d'utiliser Pandas pour tracer des moyennes mobiles, etc., et j'aimerais marquer des positions importantes avec une ligne verticale.
  • Est-il possible d'utiliser vlines, ou quelque chose de similaire, pour accomplir cela?
  • Dans ce cas, l'axe des x est datetime.

123voto

tcaswell Points 21489
plt.axvline(x_position)

Il prend les options de formatage standard du tracé (linestlye, color, etc).

(doc)

Si vous avez une référence à votre objet axes:

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

55voto

zbinsd Points 440

Si vous avez un axe temporel, et que vous avez importé Pandas en tant que pd, vous pouvez utiliser:

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

Pour plusieurs lignes:

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

19voto

Roman Orac Points 1244

La fonction de tracé du DataFrame retourne un objet AxesSubplot et vous pouvez ajouter autant de lignes que vous le souhaitez. Jetez un œil à l'exemple de code ci-dessous :

%matplotlib inline

import pandas as pd
import numpy as np

df = pd.DataFrame(index=pd.date_range("2019-07-01", "2019-07-31"))  # pour des données exemple seulement
df["y"] = np.logspace(0, 1, num=len(df))  # pour des données exemple seulement

ax = df.plot()
# vous pouvez ajouter ici autant de lignes que vous le souhaitez
ax.axhline(6, color="red", linestyle="--")
ax.axvline("2019-07-24", color="red", linestyle="--")

saisissez ici la description de l'image

11voto

Trenton_M Points 734

matplotlib.pyplot.vlines

  • Pour une série temporelle, les dates de l'axe doivent être des objets datetime corrects, pas des chaînes de caractères.
  • Permet une ou plusieurs locations
  • ymin & ymax sont spécifiés comme une valeur y spécifique, pas en pourcentage de ylim
  • Si vous faites référence aux axes avec quelque chose comme fig, axes = plt.subplots(), alors changez plt.xlines en axes.xlines
  • Voir aussi Comment dessiner des lignes verticales sur un graphique donné
  • Testé dans python 3.10, pandas 1.4.2, matplotlib 3.5.1, seaborn 0.11.2

Imports et Données d'Exemple

from datetime import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # si vous utilisez seaborn

# configurer le dataframe synthétique
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))

# afficher les premières lignes de df
                   v
2020-06-08  1.000000
2020-06-09  1.004625
2020-06-10  1.009272
2020-06-11  1.013939
2020-06-12  1.018629

Créez le graphique initial

En utilisant matplotlib.pyplot.plot ou matplotlib.axes.Axes.plot

fig, ax = plt.subplots(figsize=(9, 6))
ax.plot('v', data=df, label='v')
ax.set(xlabel='date', ylabel='v')

En utilisant pandas.DataFrame.plot

ax = df.plot(ylabel='v', figsize=(9, 6))

En utilisant seaborn.lineplot

fig, ax = plt.subplots(figsize=(9, 6))
sns.lineplot(data=df, ax=ax)
ax.set(ylabel='v')

Ajouter les lignes verticales

  • Cela devrait suivre l'une des 3 méthodes utilisées pour créer le graphique

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

    ajouter les positions x comme une liste de chaînes de date

    ax.vlines(x=['2020-07-14', '2021-07-14'], ymin=y_min, ymax=y_max, colors='purple', ls='--', lw=2, label='vline_multiple')

    ajouter les positions x comme un datetime

    ax.vlines(x=datetime(2020, 12, 25), ymin=4, ymax=9, colors='green', ls=':', lw=2, label='vline_single')

    ax.legend(bbox_to_anchor=(1.04, 0.5), loc="center left") plt.show()

entrer la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X