Pandas-Plot Alle Datumswerte auf der x-Achse anzeigen (matplolib zeigt nur wenige Werte an), formatiert als MMM-JJJJ [Duplikat]
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()

Ich erhalte die folgende Grafik und muss alle Datumswerte für jedes MONATSJAHR auf der x-Achse darstellen. Ich möchte alle Monate und Jahre, die diagonal auf der x-Achse formatiert sind, im Format (19. Februar) anzeigen. Ich kann die Größe des Plots vergrößern, um allen zu entsprechen, da ich es als JPG speichern werde.
Ich möchte, dass die x-Achse die folgenden Werte hat: 16. Januar, 16. Februar, 16. März, 16. April, 16. Mai, 16. Juni, 16. Juli, 16. August, 16. September, 16. Oktober, 16. November, 16. Dezember, 16. Januar , 17. Februar… (Ich möchte alle diese Werte anzeigen, matplotlib schneidet dies automatisch ab, ich möchte das vermeiden.)
Antworten
Wie in den Kommentaren erwähnt, müssen Sie sowohl den Locator als auch den Formatierer festlegen. Dies wird in der matplotlib-Dokumentation für Diagramme im Allgemeinen und separat für Datums- / Uhrzeitachsen ausführlich erläutert . Siehe auch eine Erklärung der TickLocators . Die Formatierungscodes werden aus den Formatcodes strftime () und strptime () von Python abgeleitet .
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()
Beispielausgabe:

Mit nur Pandas-Funktionen können Sie stftime () verwenden , um Ihren Datumsschema- Index '% Y-% m-% d' durch eine neue Form '% b-% Y' und einige Parameter im Plot zu ersetzen .
smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())
xticks, um anzugeben, welche Bezeichnung Sie unbedingt sehen möchten.
set_xticklabels , um die Liste der Beschriftungen zu ändern.
Ich schlage vor, dass Sie matplotlib und nicht pandas plot verwenden und so etwas tun, um die Daten in dem von Ihnen angegebenen Format zu zeichnen:
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""")
Sie können die Daten aus dem Datenrahmen mit folgenden Elementen abrufen: .to_numpy()
oder .values()
.
Wenden Sie sich an dieser Dokumentation für die set_xticks
Funktion.