Chuyển đến nội dung chính

Biểu đồ đường chuỗi thời gian với Matplotlib

Hướng dẫn này khám phá cách tạo và tùy chỉnh biểu đồ đường chuỗi thời gian trong matplotlib.
Đã cập nhật 5 thg 10, 2026  · 8 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

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ả:

image1.png

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'])

image4.png

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ả: 

image4.png

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ả: 

image8.png

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ả:

image5.png

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)

image9.png

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ả: 

image7.png

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ả: 

image6.png

Ở 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ả: 

image2.png

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ả: 

image10.png

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ả: 

image11.png

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

image1.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:

Chủ đề
Python
Trực quan hóa Dữ liệu

Khóa học Python

Khóa học

Nhập môn trực quan hóa dữ liệu với Matplotlib

4 giờ
236.9K
Học cách tạo, tùy chỉnh và chia sẻ các biểu đồ dữ liệu bằng Matplotlib.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm