- 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
.
Réponses
Trop de publicités?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='-')
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="--")
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.
- Utilisez
pandas.to_datetime
pour convertir les colonnes en typedatetime
.
- Utilisez
- Permet une ou plusieurs locations
ymin
&ymax
sont spécifiés comme une valeur y spécifique, pas en pourcentage deylim
- Si vous faites référence aux
axes
avec quelque chose commefig, axes = plt.subplots()
, alors changezplt.xlines
enaxes.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()