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

Biểu đồ Đường trong Matplotlib với Python

Hướng dẫn thực hành này đi sâu vào cách tạo và tùy chỉnh biểu đồ đường với Matplotlib, một thư viện trực quan hóa dữ liệu mạnh mẽ trong Python.
· 11 phút đọc

Khám phá cùng AI

Trực quan hóa dữ liệu và kể chuyện dữ liệu là kỹ năng thiết yếu với các nhà khoa học dữ liệu, vì chúng chuyển hóa những insight phức tạp thành các câu chuyện hấp dẫn, dễ hiểu để giao tiếp hiệu quả. Dù nhiều thư viện mới bắt mắt liên tục ra đời, Matplotlib vẫn là một trong những thư viện vẽ phổ biến nhất và là nền tảng cho nhiều thư viện mới hơn.

Hướng dẫn này tập trung vào một trong những kiểu biểu đồ thường gặp nhất trong Matplotlib: biểu đồ đường. Biểu đồ đường rất hiệu quả trong việc thể hiện xu hướng và biến động của dữ liệu theo thời gian, kết nối các điểm dữ liệu để phác họa rõ ràng điều đang diễn ra.

Chúng ta sẽ bắt đầu với cách tạo một biểu đồ đường đơn giản, sau đó chuyển sang các kỹ thuật nâng cao hơn như thêm thông tin thống kê vào biểu đồ. Kết thúc hướng dẫn, bạn sẽ nắm vững cách tạo các loại biểu đồ đường khác nhau trong Matplotlib và sử dụng chúng để truyền đạt insight dữ liệu một cách hiệu quả.

Sẵn sàng nâng tầm kỹ năng trực quan hóa dữ liệu của bạn chứ? Hãy bắt đầu!

Các thư viện, dữ liệu và tiền xử lý

Trước khi tạo biểu đồ đường với Matplotlib, chúng ta cần thiết lập môi trường. Việc này bao gồm cài đặt Matplotlib, import các thư viện cần thiết và tiền xử lý bộ dữ liệu dùng cho ví dụ.

Cài đặt Matplotlib

Để cài đặt Matplotlib, bạn có thể dùng pip, trình cài đặt gói của Python. Mở terminal hoặc command prompt và gõ:

pip install matplotlib

Lệnh này sẽ cài bản Matplotlib mới nhất trên máy của bạn.

Import các thư viện cần thiết

Khi đã cài Matplotlib, chúng ta cần import nó cùng các thư viện khác như NumPy và Pandas. NumPy là thư viện làm việc với mảng, còn Pandas dùng để xử lý và phân tích dữ liệu.

Để import các thư viện này, chỉ cần gõ đoạn mã sau:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

Đọc và tiền xử lý dữ liệu

Trong hướng dẫn này, chúng ta sẽ dùng bộ dữ liệu chứa giá hàng ngày của chỉ số DJIA. Bộ dữ liệu gồm năm cột: 

  • Cột Date cung cấp ngày ghi nhận các thông tin giá cổ phiếu còn lại
  • Open, Close: Giá DJIA tại thời điểm mở cửa và đóng cửa thị trường trong ngày đó
  • High, Low: Mức giá cao nhất và thấp nhất DJIA đạt được trong ngày

Sau khi tải dữ liệu, chúng ta sẽ thực hiện một số bước tiền xử lý cơ bản như đổi tên cột, chuyển sang biến datetime và sắp xếp dữ liệu theo ngày tăng dần.

Dưới đây là đoạn mã cho các bước trên:

# Load the dataset into a Pandas DataFrame
df = pd.read_csv("HistoricalPrices.csv")

# Rename the column to remove an additional space
df = df.rename(columns = {' Open': 'Open', ' High': 'High', ' Low': 'Low', ' Close': 'Close'})

# Convert the date column to datetime
df['Date'] = pd.to_datetime(df['Date'])

# Sort the dataset in the ascending order of date
df = df.sort_values(by = 'Date')

Giờ đây môi trường đã sẵn sàng và dữ liệu đã được nạp, chúng ta có thể bắt đầu tạo biểu đồ đường bằng Matplotlib.

Tạo một Biểu đồ Đường Cơ bản trong Matplotlib

Chúng ta sẽ bắt đầu bằng cách tạo một biểu đồ đường cơ bản rồi tùy chỉnh để biểu đồ trông trực quan và giàu thông tin hơn.

Dùng plt.plot() để tạo biểu đồ đường

Để tạo biểu đồ đường, chúng ta dùng hàm plt.plot(). Hàm này nhận hai tham số: giá trị trục x và giá trị trục y. Trong ví dụ này, cột date sẽ là trục x, còn cột close sẽ là trục y. Mã như sau:

# Extract the date and close price columns
dates = df['Date']
closing_price = df['Close']

# Create a line plot
plt.plot(dates, closing_price)

# Show the plot
plt.show()

Khi chạy đoạn mã trên, bạn sẽ thấy một biểu đồ đường cơ bản của cổ phiếu DJIA. 

biểu đồ đường trong matplotlib

Tùy chỉnh Biểu đồ Đường

Matplotlib cung cấp rất nhiều tùy chỉnh bổ sung mà bạn có thể tận dụng theo nhu cầu.

Thiết lập màu đường

Mặc định, hàm plt.plot() vẽ đường màu xanh lam. Tuy nhiên, bạn có thể thay đổi màu bằng cách truyền tham số color cho hàm. Tham số color có thể nhận tên màu dạng chuỗi hoặc mã màu hexadecimal. 

Ví dụ:

# Plot in Red colour
plt.plot(dates, closing_price, color='red')

# Show the plot
plt.show()

Đoạn mã này sẽ vẽ đường màu đỏ thay vì màu xanh như dưới đây:

thiết lập màu đường cho biểu đồ đường trong matplotlib

Biểu đồ đường cơ bản màu đỏ

Thiết lập độ dày đường

Bạn cũng có thể thay đổi độ dày của đường bằng cách truyền tham số linewidth vào hàm plt.plot(). Tham số linewidth nhận một giá trị số thực biểu thị độ dày của đường. 

Ví dụ:

# Increasing the linewidth
plt.plot(dates, closing_price, linewidth=3)

# Show the plot
plt.show()

Đoạn mã này sẽ vẽ đường có độ dày bằng 3 thay vì mặc định, như dưới đây: 

thiết lập độ dày đường cho biểu đồ đường trong matplotlib

Đường trong biểu đồ dày hơn nhờ tăng linewidth

Thiết lập kiểu đường

Bạn có thể thay đổi kiểu đường bằng cách truyền tham số linestyle cho hàm plt.plot(). Tham số linestyle nhận chuỗi biểu thị kiểu đường. Tài liệu matplotlib cung cấp danh sách phong phú các kiểu có sẵn. 

thiết lập kiểu đường cho biểu đồ đường trong matplotlib

Dùng trong mã như sau:

# Individually plot lines in solid, dotted, dashed and dashdot

plt.plot(dates, closing_price, linestyle='solid') # Default line style
plt.plot(dates, closing_price, linestyle='dotted')
plt.plot(dates, closing_price, linestyle='dashed')
plt.plot(dates, closing_price, linestyle='dashdot')

# Show the plot
plt.show()

Thêm marker vào biểu đồ đường

Marker có thể dùng để làm nổi bật các điểm cụ thể trên biểu đồ đường. Có nhiều ký hiệu khác nhau để dùng làm marker và bạn có thể tham khảo trong tài liệu matplotlib.

Ví dụ dùng marker trong biểu đồ đường:

# Add a cross marker for each point
plt.plot(df['Date'], df['Close'], marker='x')

# Show the plot
plt.show()

Trong đoạn mã trên, chúng ta dùng marker dấu chéo (x) để làm nổi bật giá Close của cổ phiếu DJIA như dưới đây: 

thêm marker vào biểu đồ đường trong matplotlib

Thêm nhãn trục và tiêu đề

Để biểu đồ giàu thông tin hơn, chúng ta có thể thêm nhãn trục và tiêu đề. Có thể làm điều này bằng các hàm plt.xlabel(), plt.ylabel() và plt.title() tương ứng. 

Ví dụ:

plt.plot(dates, closing_price, color='red', linewidth=2)
plt.xlabel('Date')
plt.ylabel('Closing Price')
plt.title('DJIA Stock Price')

# Show the plot
plt.show()

Đoạn mã này sẽ vẽ đường màu đỏ với độ dày 2, trục x được gán nhãn ‘Date,’ trục y gán nhãn ‘Closing Price,’ và tiêu đề ‘DJIA Stock Price.’ 

thêm nhãn và tiêu đề cho biểu đồ đường trong matplotlib

Thêm lưới

Chúng ta cũng có thể thêm đường lưới vào biểu đồ để dễ đọc hơn, bằng hàm plt.grid(). Hàm plt.grid() nhận giá trị boolean để biểu thị có hiển thị lưới hay không. 

Ví dụ: 

plt.plot(dates, closing_price, color='red', linewidth=2)
plt.xlabel('Date')
plt.ylabel('Closing Price')
plt.title('DJIA Stock Price')

# Add the grid
plt.grid(True)

# Show the plot
plt.show()

Bạn sẽ thấy lưới được thêm vào biểu đồ: 

thêm đường lưới vào biểu đồ đường trong matplotlib

Biểu đồ Đường Matplotlib với Nhiều Đường

Đôi khi bạn muốn vẽ nhiều đường trên cùng một đồ thị. Để làm điều này, bạn có thể gọi hàm plt.plot() nhiều lần với dữ liệu khác nhau cho mỗi lần gọi. Ví dụ:

# Line plot of Open and Close prices

plt.plot(df['Date'], df['Open'])
plt.plot(df['Date'], df['Close'])
plt.title('DJIA Open and Close Prices')
plt.xlabel('Date')
plt.ylabel('Price')

plt.show()

Trong đoạn mã trên, chúng ta vẽ cả giá Open và Close của cổ phiếu DJIA trên cùng một đồ thị. 

thêm đường thứ hai vào biểu đồ đường trong matplotlib

Biểu đồ Đường Matplotlib với Trục Sinh Đôi (Twin Axes)

Có những trường hợp bạn muốn biểu diễn hai biến có thang đo khác nhau trên cùng một biểu đồ. Khi đó, dùng trục sinh đôi là cách hiệu quả để trực quan hóa mối quan hệ giữa các biến mà vẫn giữ rõ ràng thang đo riêng của từng biến. 

Để tạo biểu đồ đường với trục sinh đôi, chúng ta dùng hàm twinx(). Hàm này tạo một trục y mới dùng chung trục x với biểu đồ gốc. 

Ví dụ:

# Create a new variable for demonstration purposes
df['High_minus_Low'] = df['High'] - df['Low']

# Create a basic line plot for the Close prices
fig, ax1 = plt.subplots()
ax1.plot(df['Date'], df['Close'], color='blue', label='Close Price')
ax1.set_xlabel('Date')
ax1.set_ylabel('Closing Price', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# Create a twin axis for the High_minus_Low variable
ax2 = ax1.twinx()
ax2.plot(df['Date'], df['High_minus_Low'], color='green', label='High - Low')
ax2.set_ylabel('High minus Low', color='green')
ax2.tick_params(axis='y', labelcolor='green')

# Add a title and show the plot
plt.title('DJIA Stock Price and High-Low Difference with Twin Axes')
plt.show()

Và đây là biểu đồ với trục sinh đôi: 

thêm trục thứ hai vào biểu đồ đường trong matplotlib

Thêm Thông tin Thống kê vào Biểu đồ Đường Matplotlib

Bên cạnh việc trực quan hóa xu hướng và mẫu hình, biểu đồ đường còn có thể hiển thị thông tin thống kê như đường hồi quy và thanh sai số (error bar). 

Thêm đường hồi quy trong Matplotlib

Đường hồi quy là đường phù hợp nhất với các điểm dữ liệu trên biểu đồ và có thể dùng để mô hình hóa, dự đoán giá trị tương lai. Ta có thể thêm đường hồi quy vào biểu đồ đường bằng hàm polyfit() của thư viện NumPy, hàm này khớp một đa thức hồi quy với các điểm dữ liệu của chúng ta. 

import matplotlib.dates as mdates

# Convert Date column to numeric value
df['Date'] = mdates.date2num(df['Date'])

# Add regression line to plot
coefficients_open = np.polyfit(df['Date'], df['Open'], 1)
p_open = np.poly1d(coefficients_open)

coefficients_close = np.polyfit(df['Date'], df['Close'], 1)
p_close = np.poly1d(coefficients_close)

fig, ax = plt.subplots()
ax.plot(df['Date'], df['Open'], '.', label='Open Price')
ax.plot(df['Date'], p_open(df['Date']), '-', label='Open Regression Line')
ax.plot(df['Date'], df['Close'], '.', label='Close Price')
ax.plot(df['Date'], p_close(df['Date']), '-', label='Close Regression Line')
ax.set_title('DIJA Stock Prices')
ax.set_xlabel('Date')
ax.set_ylabel('Price')
ax.legend()

# Format x-axis labels as dates
date_form = mdates.DateFormatter("%Y-%m-%d")
ax.xaxis.set_major_formatter(date_form)
plt.gcf().autofmt_xdate()

plt.show()

Trong đoạn mã này, trước tiên chúng ta chuyển ngày sang giá trị số bằng hàm date2num() rồi dùng polyfit() để lấy các hệ số của đường hồi quy. Tiếp đó, chúng ta vẽ đường bằng hàm poly1d(). Các điểm dữ liệu gốc được vẽ bằng dấu chấm và đường hồi quy bằng đường liền. 

thêm đường hồi quy vào biểu đồ đường trong matplotlib

Thêm thanh sai số (error bar)

Thanh sai số là một biểu diễn trực quan về độ biến thiên của dữ liệu và có thể dùng để chỉ mức độ không chắc chắn trong phép đo.

Điều này đặc biệt hữu ích khi bạn kỳ vọng có sai số trong quá trình thu thập dữ liệu, như dữ liệu nhiệt độ, chất lượng không khí, v.v. Dù giá cổ phiếu thường chắc chắn, giả sử có sai số tiềm năng bằng một độ lệch chuẩn và vẽ nó bằng hàm errorbar trong Matplotlib.

# Calculate standard deviation of data
std = df['Close'].std()

# Add error bars to plot
plt.errorbar(df['Date'], df['Close'], yerr=std/2, fmt='.', label='Close Price')
plt.title('DIJA Stock Prices')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()

Trong đoạn mã này, trước tiên chúng ta tính độ lệch chuẩn của giá Close trong bộ dữ liệu. Sau đó dùng hàm errorbar() để thêm thanh sai số vào biểu đồ đường, với kích thước sai số đặt bằng một nửa độ lệch chuẩn. 

thêm thanh sai số vào biểu đồ đường trong matplotlib

Những kỹ thuật này giúp chúng ta bổ sung thông tin thống kê vào biểu đồ đường và hiểu sâu hơn về dữ liệu.

Kết luận

Biểu đồ đường là công cụ mạnh để trực quan hóa xu hướng và mẫu hình trong dữ liệu, và Matplotlib cung cấp giao diện thân thiện để tạo chúng. 

Bước tiếp theo, bạn có thể học tiếp khóa Intermediate Python, nơi bạn áp dụng mọi thứ đã học vào một nghiên cứu tình huống về xác suất kiểu hacker. 

Chúng tôi hy vọng hướng dẫn này đã giúp bạn bắt đầu với việc tạo biểu đồ đường trong Matplotlib. Chúng tôi cũng đã đề cập sâu về các biểu đồ khác của matplotlib trong một hướng dẫn khác, cung cấp cái nhìn tổng quan về những gì bạn có thể làm với Matplotlib. 

Hãy tiếp tục khám phá và thử nghiệm để tạo ra các trực quan hóa ấn tượng và khám phá insight từ dữ liệu của bạn!

Chủ đề