注意
跳转至页面底部下载完整示例代码。
日期刻度标签#
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.
ax.xaxis.set_tick_params(rotation=30, rotation_mode='xtick')
plt.show()
脚本总运行时间:(0 分 1.652 秒)