Matplotlib 简明教程
Matplotlib - Dateticks
在一般绘图中, dateticks 指的是轴标记线或标记的标签,日期或时间替换默认数值。当处理时间序列数据时,此特性尤为有用。
下图说明了绘图上的日期标记−
Dateticks in Matplotlib
Matplotlib 提供用于绘制时间序列数据的强大工具,允许用户在标记线或标记(日期标记)上用日期或时间表示默认数值。该库通过将日期实例转换为自默认纪元(1970-01-01T00:00:00)起的天数,简化了处理日期的过程。这种转换连同标记定位和格式化在后台发生,对于用户是透明的。
matplotlib.dates 模块在处理各种日期相关功能方面发挥着关键作用。其中包括将数据转换为 datetime 对象、格式化日期标记标签以及设置标记的频率。
Basic Dateticks with DefaultFormatter
Matplotlib 设置了该轴的默认标记定位器和格式化程序,分别使用 AutoDateLocator 和 AutoDateFormatter 类。
Example
此示例演示了时间序列数据的绘图,此处 Matplotlib 自动处理日期格式。
import numpy as np
import matplotlib.pylab as plt
# Generate an array of dates
times = np.arange(np.datetime64('2023-01-02'),
np.datetime64('2024-02-03'), np.timedelta64(75, 'm'))
# Generate random data for y axis
y = np.random.randn(len(times))
# Create subplots
fig, ax = plt.subplots(figsize=(7,4), facecolor='.9')
ax.plot(times, y)
ax.set_xlabel('Dataticks',color='xkcd:crimson')
ax.set_ylabel('Random data',color='xkcd:black')
plt.show()
执行上述代码,我们将得到以下输出 −
Customizing Dateticks with DateFormatter
为了手动定制日期格式,Matplotlib 提供了 DateFormatter 模块,它允许用户更改日期标记的格式。
Example
此示例演示了如何手动定制日期标记的格式。
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates
# Generate an array of dates
times = np.arange(np.datetime64('2023-01-02'),
np.datetime64('2024-02-03'), np.timedelta64(75, 'm'))
# Generate random data for y axis
y = np.random.randn(len(times))
# Create subplots
fig, ax = plt.subplots(figsize=(7,5))
ax.plot(times, y)
ax.set_title('Customizing Dateticks using DateFormatter')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))
# Rotates and right-aligns the x labels so they don't overlap each other.
for label in ax.get_xticklabels(which='major'):
label.set(rotation=30, horizontalalignment='right')
plt.show()
执行上述代码,我们将得到以下输出 −
Advanced Formatting with ConciseDateFormatter
Matplotlib 中的 ConciseDateFormatter 类简化并增强了日期标记的外观。此格式化程序旨在优化标记标签的字符串选择,同时最大程度缩小它们的长度,这通常无需旋转标签。
Example
此示例使用 ConciseDateFormatter 和 AutoDateLocator 类设置绘图的最佳标记限制和日期格式。
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
# Define a starting date
base_date = datetime.datetime(2023, 12, 31)
# Generate an array of dates with a time delta of 2 hours
num_hours = 732
dates = np.array([base_date + datetime.timedelta(hours=(2 * i)) for i in range(num_hours)])
date_length = len(dates)
# Generate random data for the y-axis
np.random.seed(1967801)
y_axis = np.cumsum(np.random.randn(date_length))
# Define different date ranges
date_ranges = [
(np.datetime64('2024-01'), np.datetime64('2024-03')),
(np.datetime64('2023-12-31'), np.datetime64('2024-01-31')),
(np.datetime64('2023-12-31 23:59'), np.datetime64('2024-01-01 13:20'))
]
# Create subplots for each date range
figure, axes = plt.subplots(3, 1, constrained_layout=True, figsize=(6, 6))
for nn, ax in enumerate(axes):
# AutoDateLocator and ConciseDateFormatter for date formatting
locator = mdates.AutoDateLocator(minticks=3, maxticks=7)
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
# Plot the random data within the specified date range
ax.plot(dates, y_axis)
ax.set_xlim(date_ranges[nn])
axes[0].set_title('Concise Date Formatter')
# Show the plot
plt.show()
执行上述代码,我们将得到以下输出 −