Matplotlib 简明教程

Matplotlib - Dateticks

在一般绘图中, dateticks 指的是轴标记线或标记的标签,日期或时间替换默认数值。当处理时间序列数据时,此特性尤为有用。

下图说明了绘图上的日期标记−

dateticks input

Dateticks in Matplotlib

Matplotlib 提供用于绘制时间序列数据的强大工具,允许用户在标记线或标记(日期标记)上用日期或时间表示默认数值。该库通过将日期实例转换为自默认纪元(1970-01-01T00:00:00)起的天数,简化了处理日期的过程。这种转换连同标记定位和格式化在后台发生,对于用户是透明的。

matplotlib.dates 模块在处理各种日期相关功能方面发挥着关键作用。其中包括将数据转换为 datetime 对象、格式化日期标记标签以及设置标记的频率。

Basic Dateticks with DefaultFormatter

Matplotlib 设置了该轴的默认标记定位器和格式化程序,分别使用 AutoDateLocatorAutoDateFormatter 类。

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()

执行上述代码,我们将得到以下输出 −

dateticks ex1

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()

执行上述代码,我们将得到以下输出 −

dateticks ex2

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()

执行上述代码,我们将得到以下输出 −

dateticks ex3