Pandas-Plot Alle Datumswerte auf der x-Achse anzeigen (matplolib zeigt nur wenige Werte an), formatiert als MMM-JJJJ [Duplikat]

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()

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

1 Mr.T Dec 17 2020 at 22:48

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:

Boul Dec 17 2020 at 20:47

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.

LucaAngioloni Dec 17 2020 at 20:14

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_xticksFunktion.