Pandas Plotting Hiển thị tất cả các giá trị ngày trên trục x (matplolib chỉ hiển thị một số giá trị) được định dạng là MMM-YYYY [trùng lặp]
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()
Tôi nhận được biểu đồ sau và cần vẽ tất cả các giá trị ngày cho mỗi THÁNG-NĂM trên trục x. Tôi muốn hiển thị tất cả các tháng và năm được định dạng theo đường chéo trên trục x theo định dạng (ngày 19 tháng 2). Tôi có thể làm cho kích thước của mảnh đất lớn hơn để phù hợp với tất cả vì tôi sẽ lưu nó dưới dạng jpg.
Tôi muốn trục x có các giá trị sau: 16 tháng 1, 16 tháng 2, 16 tháng 3, 16 tháng 4, 16 tháng 5, 16 tháng 6, 16 tháng 7, 16 tháng 8, 16 tháng 9, 16 tháng 10, 16 tháng 11, 16 tháng 12, 17 tháng 1 , Ngày 17 tháng 2… (Tôi muốn hiển thị tất cả các giá trị này, matplotlib tự động cắt bớt điều này, tôi muốn tránh điều đó)
Trả lời
Như đã đề cập trong các nhận xét, bạn phải đặt cả hai, Bộ định vị và Bộ định dạng. Điều này được giải thích rõ trong tài liệu matplotlib dành cho đồ thị nói chung và riêng cho trục ngày giờ . Xem thêm giải thích về TickLocators . Mã định dạng bắt nguồn từ mã định dạng strftime () và strptime () của 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()
Đầu ra mẫu:
Chỉ với các hàm pandas, bạn có thể sử dụng stftime () để thay thế chỉ mục lược đồ ngày tháng của mình '% Y-% m-% d' bằng một dạng mới '% b-% Y' và một số tham số trong biểu đồ .
smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())
xticks để chỉ định nhãn mà bạn hoàn toàn muốn xem.
set_xticklabels để sửa đổi danh sách các nhãn.
Tôi khuyên bạn nên sử dụng matplotlib chứ không phải biểu đồ gấu trúc và làm điều gì đó như sau để vẽ biểu đồ ngày ở định dạng bạn đã chỉ định:
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""")
Bạn có thể lấy dữ liệu ra khỏi khung dữ liệu bằng một số thứ như: .to_numpy()hoặc .values().
Tham khảo tài liệu này để biết set_xtickschức năng.