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