注意
前往結尾下載完整範例程式碼。
日期刻度標籤#
Matplotlib 日期繪圖是藉由將日期實例轉換為自紀元(預設為 1970-01-01T00:00:00)以來的日數完成的。matplotlib.dates
模組提供轉換函式 date2num
和 num2date
,用於將 datetime.datetime
和 numpy.datetime64
物件轉換為 Matplotlib 的內部表示法並從中轉換。這些資料類型已在 matplotlib.units
中描述的單位轉換機制中註冊,因此轉換會自動為使用者發生。註冊流程也會將軸的預設刻度 locator
和 formatter
設定為 AutoDateLocator
和 AutoDateFormatter
。
另一種格式化器是 ConciseDateFormatter
,在下方的第二個 Axes
中使用(請參閱使用 ConciseDateFormatter 格式化日期刻度),這通常消除了旋轉刻度標籤的需求。最後一個 Axes
使用 DateFormatter
手動格式化日期,使用 datetime.date.strftime
中記錄的格式字串格式化日期。

import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import matplotlib.dates as mdates
# Load a numpy record array from yahoo csv data with fields date, open, high,
# low, close, volume, adj_close from the mpl-data/sample_data directory. The
# record array stores the date as an np.datetime64 with a day unit ('D') in
# the date column.
data = cbook.get_sample_data('goog.npz')['price_data']
fig, axs = plt.subplots(3, 1, figsize=(6.4, 7), layout='constrained')
# common to all three:
for ax in axs:
ax.plot('date', 'adj_close', data=data)
# Major ticks every half year, minor ticks every month,
ax.xaxis.set_major_locator(mdates.MonthLocator(bymonth=(1, 7)))
ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.grid(True)
ax.set_ylabel(r'Price [\$]')
# different formats:
ax = axs[0]
ax.set_title('DefaultFormatter', loc='left', y=0.85, x=0.02, fontsize='medium')
ax = axs[1]
ax.set_title('ConciseFormatter', loc='left', y=0.85, x=0.02, fontsize='medium')
ax.xaxis.set_major_formatter(
mdates.ConciseDateFormatter(ax.xaxis.get_major_locator()))
ax = axs[2]
ax.set_title('Manual DateFormatter', loc='left', y=0.85, x=0.02,
fontsize='medium')
# Text in the x-axis will be displayed in 'YYYY-mm' format.
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))
# Rotates and right-aligns the x labels so they don't crowd each other.
for label in ax.get_xticklabels(which='major'):
label.set(rotation=30, horizontalalignment='right')
plt.show()
指令碼的總執行時間: (0 分鐘 3.622 秒)