Pandas Plotting Wyświetla wszystkie wartości dat na osi X (matplolib wyświetla tylko kilka wartości) w formacie MMM-RRRR [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()

Otrzymuję następujący wykres i muszę wykreślić wszystkie wartości dat dla każdego MIESIĄCA-ROKU na osi x. Chcę wyświetlić wszystkie miesiące i lata sformatowane ukośnie na osi X w formacie (luty-19). Mogę zwiększyć rozmiar działki, aby pasowała do wszystkich, ponieważ zapiszę ją jako jpg.

Chcę, aby oś X miała następujące wartości: 16 stycznia, 16 lutego, 16 marca, 16 kwietnia, 16 maja, 16 czerwca, 16 lipca, 16 sierpnia, 16 września, 16 października, 16 listopada, 16 grudnia, 17 stycznia , 17 lutego… (Chcę wyświetlić wszystkie te wartości, matplotlib automatycznie obcina to, chcę tego uniknąć)

Odpowiedzi

1 Mr.T Dec 17 2020 at 22:48

Jak wspomniano w komentarzach, musisz ustawić zarówno Locator, jak i Formatter. Jest to dobrze wyjaśnione w dokumentacji matplotlib dla wykresów ogólnie i oddzielnie dla osi datetime . Zobacz także wyjaśnienie TickLocators . Kody formatujące pochodzą z kodów formatu strftime () i strptime () Pythona .

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

Przykładowe dane wyjściowe:

Boul Dec 17 2020 at 20:47

Mając tylko funkcje pandy, możesz użyć stftime (), aby zastąpić indeks schematu dat „% Y-% m-% d” nową formą „% b-% Y” i niektórymi parametrami na wykresie .

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

xticks, aby określić, którą etykietę absolutnie chcesz zobaczyć.

set_xticklabels, aby zmodyfikować listę etykiet.

LucaAngioloni Dec 17 2020 at 20:14

Sugeruję użycie matplotlib zamiast wykresu pandy i zrobienie czegoś takiego, aby wykreślić daty w określonym formacie:

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

Możesz pobrać dane z ramki danych za pomocą czegoś takiego: .to_numpy()lub .values().

Informacje na temat funkcji można znaleźć w tej dokumentacjiset_xticks .