Tracé des pandas Afficher toutes les valeurs de date sur l'axe des x (matplolib n'affiche que quelques valeurs) au format MMM-AAAA [dupliquer]

Dec 17 2020
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime

df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

J'obtiens le graphique suivant et je dois tracer toutes les valeurs de date pour chaque MOIS-ANNÉE sur l'axe des x. Je veux afficher tous les mois et années formatés en diagonale sur l'axe des x dans le format (19 février). Je peux agrandir la taille de l'intrigue pour qu'elle s'adapte à tous, car je l'enregistrerai au format jpg.

Je veux que l'axe des abscisses ait les valeurs suivantes: 16 janvier, 16 février, 16 mars, 16 avril, 16 mai, 16 juin, 16 juillet, 16 août, 16 septembre, 16 octobre, 16 novembre, 16 décembre, 17 janvier , 17 février… (je veux afficher toutes ces valeurs, matplotlib tronque automatiquement ceci, je veux éviter cela)

Réponses

1 Mr.T Dec 17 2020 at 22:48

Comme mentionné dans les commentaires, vous devez définir les deux, le localisateur et le formateur. Ceci est bien expliqué dans la documentation matplotlib pour les graphes en général et séparément pour les axes datetime . Voir aussi une explication des TickLocators . Les codes de formatage sont dérivés des codes de format strftime () et strptime () de Python .

from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter


#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)

ax = df.plot()

#defines the tick location 
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)

plt.tight_layout()
plt.show()

Exemple de sortie:

Boul Dec 17 2020 at 20:47

Avec seulement les fonctions pandas, vous pouvez utiliser stftime () pour remplacer votre index de schéma de dates '% Y-% m-% d' par une nouvelle forme '% b-% Y' et quelques paramètres dans plot .

smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())

xticks pour spécifier quelle étiquette vous voulez absolument voir.

set_xticklabels pour modifier la liste des libellés.

LucaAngioloni Dec 17 2020 at 20:14

Je vous suggère d'utiliser matplotlib et non pandas plot, et de faire quelque chose comme ceci pour tracer les dates dans le format que vous avez spécifié:

import matplotlib.dates as mdates

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
                                      # %b is Month abbreviated name, %Y is the Year

# ... after some code

fig, ax = plt.subplots(figsize=(15,8))

ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()

# Plot data ...

ax.set_xticks("""... define how often to show the date""")

Vous pouvez extraire les données du bloc de données avec quelque chose comme: .to_numpy()ou .values().

Reportez-vous à cette documentation pour la set_xticksfonction.