Pandas Plotting Menampilkan semua nilai tanggal pada sumbu x (matplolib hanya menampilkan beberapa nilai) dengan format MMM-YYYY [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()

Saya mendapatkan grafik berikut dan perlu memplot semua nilai tanggal untuk setiap MONTH-YEAR pada sumbu x. Saya ingin menampilkan semua bulan dan tahun dalam format diagonal pada sumbu x dalam format (Feb-19). Saya dapat membuat ukuran plot lebih besar agar sesuai dengan semua karena saya akan menyimpannya sebagai jpg.

Saya ingin sumbu x memiliki nilai berikut: 16 Jan, 16 Feb, 16 Mar, 16 Apr, 16 Mei, 16 Jun, 16 Jul, 16 Agustus, 16 Sep, 16 Okt, 16 Nov, 16 Des, 17 Jan , 17 Feb… (Saya ingin menampilkan semua nilai ini, matplotlib otomatis memotongnya, saya ingin menghindarinya)

Jawaban

1 Mr.T Dec 17 2020 at 22:48

Seperti yang disebutkan dalam komentar, Anda harus mengatur keduanya, Locator dan Formatter. Ini dijelaskan dengan baik dalam dokumentasi matplotlib untuk grafik secara umum dan secara terpisah untuk sumbu datetime . Lihat juga penjelasan tentang TickLocators . Kode pemformatan berasal dari kode format strftime () dan strptime () 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()

Output sampel:

Boul Dec 17 2020 at 20:47

Dengan hanya fungsi panda, Anda dapat menggunakan stftime () untuk mengganti indeks skema tanggal Anda '% Y-% m-% d' dengan bentuk baru '% b-% Y' dan beberapa parameter dalam plot .

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

xticks untuk menentukan label mana yang benar-benar ingin Anda lihat.

set_xticklabels untuk mengubah daftar label.

LucaAngioloni Dec 17 2020 at 20:14

Saya sarankan Anda menggunakan matplotlib dan bukan pandas pandas, dan lakukan sesuatu seperti ini untuk memplot tanggal dalam format yang Anda tentukan:

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

Anda bisa mendapatkan data dari bingkai data dengan sesuatu seperti: .to_numpy()atau .values().

Lihat dokumentasi ini untuk mengetahui set_xticksfungsinya.