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]
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
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:

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.
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_xticks
fonction.