Khóa học
Chuỗi thời gian là tập hợp các quan sát dữ liệu được lập chỉ mục theo thời gian theo thứ tự thời gian. Các quan sát này thường (nhưng không nhất thiết) được ghi lại theo các khoảng thời gian đều đặn. Chuỗi thời gian thường được sử dụng trong ngân hàng, giao dịch, tiếp thị, khoa học và nhiều lĩnh vực khác. Cách trực quan hóa phổ biến nhất cho dữ liệu chuỗi thời gian là biểu đồ đường, trong đó thời gian nằm trên trục x và giá trị đo được – trên trục y.
Trong hướng dẫn này, chúng ta sẽ khám phá cách tạo và tùy chỉnh biểu đồ đường chuỗi thời gian trong matplotlib, thư viện vẽ biểu đồ chính của Python.
Bắt đầu với vẽ chuỗi thời gian trong matplotlib
Import thư viện và nạp dữ liệu
Trước tiên, chúng ta sẽ import các thư viện Python cần thiết và nạp dữ liệu – bộ dữ liệu Kaggle Daily Exchange Rates per Euro 1999-2023. Chúng ta cũng sẽ thực hiện một số bước làm sạch dữ liệu cơ bản:
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime
df = pd.read_csv('euro-daily-hist_1999_2022.csv')
df = df.iloc[:, [0, 4, 28, -2]]
df.columns = ['Date', 'CAD', 'NZD', 'USD']
for col in ['CAD', 'NZD', 'USD']:
df = df[df[col] != '-']
df[col] = pd.to_numeric(df[col])
df = df[df['Date'] >= '2022-12-01'].reset_index(drop=True)
print(df.head(3))
print(f'\nThe date range: {df.Date.min()}/{ df.Date.max()}')
Kết quả:
Date CAD NZD USD
0 2023-01-27 1.4479 1.6759 1.0865
1 2023-01-26 1.4568 1.6799 1.0895
2 2023-01-25 1.4544 1.6792 1.0878
The date range: 2022-12-01/2023-01-27
Chuyển đổi chuỗi ngày/giờ thành đối tượng datetime
Để làm việc hiệu quả với chuỗi thời gian, chúng ta cần chuyển chuỗi ngày hoặc giờ thành đối tượng datetime bằng hàm pandas.to_datetime:
df['Date'] = pd.to_datetime(df['Date'])
print(df['Date'].dtypes)
Kết quả:
datetime64[ns]
Nếu bạn cần ôn lại cách làm việc với chuỗi thời gian trong Python, bạn có thể thấy hữu ích khóa học Manipulating Time Series Data in Python.
Đặt cột datetime làm chỉ mục của dataframe
Bây giờ, hãy đặt cột Date làm chỉ mục của dataframe bằng phương thức set_index:
df = df.set_index('Date')
print(df.head(3))
Kết quả:
CAD NZD USD
Date
2023-01-27 1.4479 1.6759 1.0865
2023-01-26 1.4568 1.6799 1.0895
2023-01-25 1.4544 1.6792 1.0878
Tạo biểu đồ đường chuỗi thời gian đơn giản với matplotlib
Để tạo một biểu đồ đường chuỗi thời gian cơ bản, chúng ta dùng phương thức chuẩn matplotlib.pyplot.plot(x, y):
plt.plot(df.index, df['CAD'])
Kết quả:

Tạo biểu đồ đường chuỗi thời gian nhiều đường trong matplotlib
Để tạo biểu đồ chuỗi thời gian nhiều đường, chúng ta chỉ cần gọi phương thức matplotlib.pyplot.plot(x, y) số lần cần thiết:
plt.plot(df.index, df['CAD'])
plt.plot(df.index, df['NZD'])
plt.plot(df.index, df['USD'])

Dùng vòng lặp for giúp tối ưu đoạn mã trên:
for col in ['CAD', 'NZD', 'USD']:
plt.plot(df.index, df[col])
Kết quả:

Tùy chỉnh biểu đồ chuỗi thời gian trong matplotlib
Để biểu đồ đường chuỗi thời gian dễ đọc và hấp dẫn hơn, chúng ta cần tùy chỉnh nó. Có thể áp dụng các tinh chỉnh matplotlib phổ biến như chỉnh kích thước figure, thêm và tùy chỉnh tiêu đề biểu đồ và nhãn trục, thay đổi thuộc tính đường, thêm và tùy chỉnh marker, v.v. Một số tinh chỉnh khác mang tính đặc thù cho biểu đồ chuỗi thời gian, như tùy chỉnh vạch chia trên trục thời gian và nhãn của chúng hoặc làm nổi bật các giai đoạn thời gian nhất định.
Tùy chỉnh figure và axes
Dùng các phương thức tiêu chuẩn của matplotlib, chúng ta có thể tùy chỉnh figure và axes của biểu đồ đường chuỗi thời gian theo nhiều cách, như mô tả trong chú thích mã dưới đây:
# Adjusting the figure size
fig = plt.subplots(figsize=(16, 5))
# Creating a plot
plt.plot(df.index, df['CAD'])
# Adding a plot title and customizing its font size
plt.title('EUR-CAD rate', fontsize=20)
# Adding axis labels and customizing their font size
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
# Rotaing axis ticks and customizing their font size
plt.xticks(rotation=30, fontsize=15)
# Changing the plot resolution - zooming in the period from 15.12.2022 till 15.01.2023
plt.xlim(pd.Timestamp('2022-12-15'), pd.Timestamp('2023-01-15'))
Kết quả:

Tùy chỉnh thuộc tính đường
Tương tự biểu đồ đường thông thường, bạn có thể thay đổi thuộc tính đường của biểu đồ chuỗi thời gian như màu sắc, kiểu hoặc độ dày đường:
plt.plot(df.index, df['CAD'], color='green', linestyle='dashed', linewidth=3)
Kết quả:

Thêm và tùy chỉnh marker
Như với bất kỳ biểu đồ đường nào, chúng ta có thể đặt marker trên biểu đồ chuỗi thời gian và tùy chỉnh ký hiệu, màu, màu viền và kích thước của chúng:
plt.plot(df.index, df['CAD'], marker='o', markerfacecolor='yellow', markeredgecolor='red', markersize=8)

Tùy chỉnh vạch chia trên trục thời gian
Trước hết, hãy tạo một biểu đồ đường chuỗi thời gian cơ bản trong matplotlib với một số tùy chỉnh thiết yếu:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
Kết quả:

Ta thấy mặc định matplotlib hiển thị một số vạch chia ngẫu nhiên cùng với nhãn của chúng. Tuy nhiên, đôi khi chúng ta muốn kiểm soát các vạch chia được hiển thị trên trục thời gian. Khi đó, cần cung cấp danh sách các ngày (hoặc thời điểm) cần thiết dưới dạng chuỗi hoặc pandas timestamp cho phương thức matplotlib.pyplot.xticks:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying time axis ticks
ticks = ['2022-12-05', '2023-01-02', '2023-01-20']
plt.xticks(ticks)
Kết quả:

Ở trên, matplotlib đã hiển thị các vạch chia đã chọn và tự động gán nhãn cho chúng.
Nếu muốn hiển thị tất cả vạch chia, chúng ta nên cung cấp danh sách chỉ mục của chuỗi thời gian cho phương thức matplotlib.pyplot.xticks:
fig = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
# Defining and displaying all time axis ticks
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
Kết quả:

Tùy chỉnh nhãn vạch chia trục thời gian
Các nhãn vạch chia trục thời gian trên biểu đồ trên có thể trông khá rối. Chúng ta có thể định dạng chúng để dễ đọc hơn. Để làm điều này, ta dùng lớp matplotlib.dates.DateFormatter và truyền vào một chuỗi định dạng strftime phản ánh cách muốn hiển thị ngày/giờ. Sau đó truyền formatter này vào phương thức matplotlib.axis.XAxis.set_major_formatter:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
# Formatting time axis tick labels
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
Kết quả:

Trang tài liệu này cung cấp danh sách đầy đủ tất cả các mã định dạng strftime có thể dùng.
Làm nổi bật các giai đoạn thời gian nhất định
Đôi khi, chúng ta muốn tô bóng một số khoảng thời gian trên biểu đồ chuỗi thời gian. Để làm vậy, có thể dùng phương thức matplotlib.pyplot.axvspan. Nó nhận hai đối số bắt buộc: thời điểm bắt đầu và kết thúc của giai đoạn quan tâm ở định dạng datetime. Phương thức cũng có thể nhận một số tham số tùy chọn để tùy chỉnh vùng được tô sáng như màu sắc, màu viền, độ trong suốt, độ dày nét hoặc họa tiết tô.
Hãy áp dụng kỹ thuật này cho biểu đồ ở phần trước:
fig, ax = plt.subplots(figsize=(16, 5))
plt.plot(df.index, df['CAD'])
plt.title('EUR-CAD rate', fontsize=20)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Rate', fontsize=15)
plt.xlim(df.index.min(), df.index.max())
ticks = list(df.index)
plt.xticks(ticks, rotation=45)
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b %d'))
# Highlighting the time period from 15.12.2022 to 1.01.2023 and customizing the shaded area
plt.axvspan(datetime(2022, 12, 15), datetime(2023, 1, 1), facecolor='yellow', alpha=0.5, hatch='/', edgecolor='red', linewidth=5)
Kết quả:

Lưu biểu đồ đường chuỗi thời gian của matplotlib ra tệp
Thay vì chỉ hiển thị, chúng ta có thể lưu biểu đồ đường chuỗi thời gian ra tệp ảnh. Để làm vậy, dùng phương thức matplotlib.pyplot.savefig và truyền vào tên tệp. Ví dụ, hãy quay lại biểu đồ cơ bản đầu tiên của chúng ta:
plt.plot(df.index, df['CAD'])
# Saving the resulting plot to a file
plt.savefig('time series line plot.png')

Ở trên, chúng ta đã lưu biểu đồ vào tệp có tên time series line plot.png và nằm cùng vị trí với chương trình hiện tại.
Kết luận
Tóm lại, trong hướng dẫn này, chúng ta đã thảo luận cách tạo và tùy chỉnh biểu đồ đường chuỗi thời gian trong matplotlib, sử dụng cả các phương thức chung của matplotlib và những phương thức nâng cao, chỉ dành riêng cho trực quan hóa chuỗi thời gian.
Sau khi nắm các kỹ thuật nền tảng này, bạn có thể muốn đi sâu hơn vào làm việc với dữ liệu chuỗi thời gian và trực quan hóa chúng trong Python. Khi đó, hãy cân nhắc khám phá các tài nguyên toàn diện, thân thiện với người mới bắt đầu và có tính end-to-end sau: