Trong hướng dẫn này, tôi trình bày cách tạo biểu đồ đường, biểu đồ cột và biểu đồ phân tán trong Matplotlib bằng dữ liệu thị trường chứng khoán. Hướng dẫn giả định bạn đã quen với mảng NumPy và DataFrame của pandas. Tôi sẽ giải thích từng lệnh thư viện khi chúng xuất hiện, nhưng trọng tâm chính ở đây là Matplotlib.
Tóm tắt nhanh
-
Matplotlib là thư viện vẽ nền tảng của Python — cài đặt bằng
pip install matplotlibvà import nhưimport matplotlib.pyplot as plt -
Tạo biểu đồ đường với
plt.plot(x, y), biểu đồ cột vớiplt.bar(x, height), và biểu đồ phân tán vớiplt.scatter(x, y) -
Luôn gọi
plt.show()để hiển thị biểu đồ, hoặcplt.savefig('filename.png')để lưu lại -
Tùy chỉnh với
plt.title(),plt.xlabel(),plt.ylabel(), và tham sốcolor -
Dùng bản đồ màu (
cmap) cho dữ liệu liên tục vàplt.legend()cho biểu đồ nhiều chuỗi
Matplotlib là gì?
Matplotlib là thư viện trực quan hóa dữ liệu được dùng rộng rãi nhất trong Python, với hơn 50 triệu lượt tải mỗi tháng tính đến năm 2026. Nó tạo các biểu đồ tĩnh, tương tác và động gồm biểu đồ đường, cột, phân tán, histogram và nhiều hơn nữa. Phần lớn các thư viện trực quan hóa Python khác (Seaborn, vẽ bằng pandas, thậm chí một phần của Plotly) được xây dựng dựa trên Matplotlib.
Matplotlib cung cấp khả năng điều khiển chi tiết từng yếu tố hiển thị, đồng nghĩa bạn sẽ cần nhiều mã hơn ngay cả với các biểu đồ cơ bản. Nếu ưu tiên của bạn là biểu đồ khám phá nhanh, Seaborn cung cấp các thiết lập mức cao trông ổn ngay từ đầu. Với biểu đồ web tương tác, Plotly Express là một lựa chọn đáng cân nhắc khác.
Đến cuối hướng dẫn này, bạn sẽ biết cách tạo biểu đồ đường, cột và phân tán như ở dưới đây, cùng các tùy chỉnh cơ bản: chọn màu, thêm nhãn và tiêu đề, đặt giới hạn trục, và lưu hình đã hoàn thiện ra tệp.

Bắt đầu với Matplotlib
Không dài dòng nữa, hãy tải Matplotlib và nhanh chóng xem qua tập dữ liệu dùng cho hướng dẫn này.
Nạp Matplotlib
Trước khi tạo bất kỳ biểu đồ nào, bạn cần import thư viện. Tiểu mô-đun pyplot cung cấp tất cả các hàm vẽ được dùng trong hướng dẫn này.
Quy ước là đặt bí danh pyplot thành plt. Tôi cũng import pandas, NumPy và datetime vì các phần sau sẽ dùng đến.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from datetime import datetime
Nạp tập dữ liệu chỉ số DJIA
Matplotlib được thiết kế để làm việc với mảng NumPy và dataframe pandas. Thư viện giúp bạn dễ dàng dựng đồ thị từ dữ liệu dạng bảng. Trong hướng dẫn này, chúng ta sẽ dùng dữ liệu giá lịch sử của chỉ số Dow Jones Industrial Average (DJIA) từ 2022-01-01 đến 2022-12-31 (tại đây). Bạn có thể đặt khoảng ngày trên trang rồi bấm nút “download a spreadsheet”.
Chúng ta sẽ nạp tệp CSV có tên HistoricalPrices.csv bằng thư viện pandas và xem vài dòng đầu bằng phương thức .head().
import pandas as pd
djia_data = pd.read_csv('HistoricalPrices.csv')
djia_data.head()

Ta thấy dữ liệu gồm 4 cột: Date, Open, High, Low và Close. Bốn cột sau liên quan đến giá của chỉ số trong ngày giao dịch. Dưới đây là mô tả ngắn cho từng biến.
- Date: Ngày mà thông tin giá cổ phiếu thể hiện.
- Open: Giá của DJIA lúc 9:30 AM ET khi thị trường mở cửa.
- High: Mức giá cao nhất DJIA đạt được trong ngày.
- Low: Mức giá thấp nhất DJIA đạt được trong ngày.
- Close: Giá của DJIA khi thị trường ngừng giao dịch lúc 4:00 PM ET.
Như một bước dọn dẹp nhanh, ta cũng cần dùng phương thức rename() trong pandas, vì tập dữ liệu tải về có thêm khoảng trắng ở tên cột.
djia_data = djia_data.rename(columns = {' Open': 'Open', ' High': 'High', ' Low': 'Low', ' Close': 'Close'})
Ta cũng chuyển cột Date sang kiểu datetime và sắp xếp tăng dần theo ngày. Để tìm hiểu thêm về chuyển đổi kiểu dữ liệu, xem hướng dẫn Chuyển đổi kiểu dữ liệu trong Python.
djia_data['Date'] = pd.to_datetime(djia_data['Date'])
djia_data = djia_data.sort_values(by = 'Date')
Vẽ biểu đồ đường với Matplotlib
Biểu đồ đường cho thấy giá trị thay đổi theo một đại lượng liên tục, thường là theo thời gian. Đây là lựa chọn hàng đầu cho dữ liệu chuỗi thời gian vì các điểm nối liền giúp bộc lộ xu hướng, tính mùa vụ và điểm bất thường ngay lập tức.
Biểu đồ đường với một đường
Ta có thể tạo biểu đồ đường trong matplotlib bằng phương thức plt.plot(), trong đó đối số thứ nhất là biến x và đối số thứ hai là biến y trên biểu đồ. Mỗi khi tạo một biểu đồ, cần gọi plt.show() để chắc chắn thấy được đồ thị vừa vẽ. Ta sẽ trực quan hóa giá đóng cửa theo thời gian của DJIA.
plt.plot(djia_data['Date'], djia_data['Close'])
plt.show()

Có thể thấy trong năm, giá chỉ số bắt đầu ở mức cao nhất, sau đó dao động lên xuống trong năm. Giá chạm mức thấp nhất vào khoảng tháng 10, rồi tăng mạnh vào cuối năm.
Biểu đồ đường với nhiều đường
Ta có thể hiển thị nhiều đường trên cùng một biểu đồ bằng cách thêm một lệnh plt.plot() khác trước hàm plt.show().
plt.plot(djia_data['Date'], djia_data['Open'])
plt.plot(djia_data['Date'], djia_data['Close'])
plt.show()

Trong năm, ta thấy giá mở cửa và đóng cửa của DJIA khá sát nhau ở mỗi ngày, không có mẫu hình rõ ràng về việc một giá luôn cao hơn hay thấp hơn giá còn lại.
Thêm chú giải (legend)
Nếu muốn phân biệt đường nào ứng với cột nào, ta có thể thêm chú giải. Điều này sẽ tạo nhãn mã màu ở góc đồ thị. Ta làm được bằng plt.legend() và thêm tham số label vào mỗi lệnh plt.plot().
plt.plot(djia_data['Date'], djia_data['Open'], label = 'Open')
plt.plot(djia_data['Date'], djia_data['Close'], label = 'Close')
plt.legend()
plt.show()

Bây giờ ta thấy một chú giải với các nhãn đã chỉ định xuất hiện ở vị trí mặc định góc trên bên phải (có thể chỉ định vị trí bằng tham số loc trong plt.legend()).
Vẽ biểu đồ cột với Matplotlib
Biểu đồ cột rất hữu ích để so sánh các giá trị số giữa các danh mục. Chúng đặc biệt hữu ích để tìm danh mục lớn nhất và nhỏ nhất.
Trong phần này, ta tổng hợp dữ liệu thành trung bình theo tháng bằng pandas .groupby() để so sánh hiệu suất DJIA theo tháng. Để tìm hiểu sâu hơn về thao tác nhóm, xem hướng dẫn Pandas GroupBy.
# Import gói calendar
from calendar import month_name
# Sắp xếp tháng theo thứ tự thời gian
djia_data['Month'] = pd.Categorical(djia_data['Date'].dt.month_name(), month_name[1:])
# Nhóm chỉ số theo trung bình tháng
djia_monthly_mean = djia_data \
.groupby('Month') \
.mean(numeric_only=True) \
.reset_index()
djia_monthly_mean.head(6)

Biểu đồ cột dọc
Ta sẽ bắt đầu bằng việc tạo biểu đồ cột với các cột dọc. Có thể làm điều này bằng phương thức plt.bar() với đối số thứ nhất là biến trục x (Month) và tham số height là trục y (Close). Sau đó nhớ gọi plt.show() để hiển thị biểu đồ.
plt.bar(djia_monthly_mean['Month'], height = djia_monthly_mean['Close'])
plt.show()

Ta thấy hầu hết giá đóng cửa của DJIA khá sát nhau, với giá trị trung bình thấp nhất vào tháng 6 và cao nhất vào tháng 1.
Sắp xếp lại các cột
Nếu muốn hiển thị các cột theo thứ tự từ cao xuống thấp theo giá đóng cửa trung bình tháng, ta có thể sắp xếp bằng phương thức sort_values() trong pandas, rồi dùng lại phương thức plt.bar() như cũ.
djia_monthly_mean_srtd = djia_monthly_mean.sort_values(by = 'Close', ascending = False)
plt.bar(djia_monthly_mean_srtd['Month'], height = djia_monthly_mean_srtd['Close'])
plt.show()

Như bạn thấy, sẽ dễ dàng hơn nhiều để nhận ra tháng nào có giá đóng cửa trung bình DJIA cao nhất và tháng nào thấp nhất. Việc so sánh và xếp hạng giữa các tháng cũng dễ hơn.
Biểu đồ cột ngang
Đôi khi, việc diễn giải biểu đồ cột và đọc nhãn sẽ dễ hơn khi ta dùng cột ngang. Ta có thể làm điều này bằng phương thức plt.barh().
plt.barh(djia_monthly_mean_srtd['Month'], width = djia_monthly_mean_srtd['Close'])
plt.show()

Như bạn thấy, nhãn của từng danh mục (tháng) dễ đọc hơn so với khi cột dựng đứng. Ta vẫn có thể so sánh dễ dàng giữa các nhóm. Biểu đồ cột ngang đặc biệt hữu ích khi có nhiều danh mục.
Vẽ biểu đồ phân tán với Matplotlib
Biểu đồ phân tán cho thấy mối quan hệ giữa hai biến số. Mỗi điểm đại diện một quan sát, và mô hình tổng thể cho thấy có mối quan hệ tuyến tính, phi tuyến hay không có mối quan hệ, điều này ảnh hưởng trực tiếp đến lựa chọn kỹ thuật mô hình hóa của bạn.
Tạo biểu đồ phân tán cơ bản
Tương tự các biểu đồ khác, biểu đồ phân tán có thể tạo bằng pyplot.scatter(), trong đó đối số đầu là biến trục x và đối số thứ hai là biến trục y. Trong ví dụ này, ta sẽ xem mối quan hệ giữa giá mở cửa và đóng cửa của DJIA.
plt.scatter(djia_data['Open'], djia_data['Close'])
plt.show()

Trên trục x là giá mở cửa của DJIA, và trên trục y là giá đóng cửa. Đúng như kỳ vọng, khi giá mở cửa tăng, ta thấy mối quan hệ chặt chẽ khi giá đóng cửa cũng tăng theo.
Thêm đường xu hướng
Tiếp theo, ta sẽ thêm một đường xu hướng vào đồ thị để thể hiện rõ hơn mối quan hệ tuyến tính giữa biến mở cửa và đóng cửa. Để làm điều này, ta dùng polyfit() và poly1d() của numpy. Phương thức đầu cho ta phép khớp đa thức bình phương tối thiểu, trong đó đối số thứ nhất là biến x, đối số thứ hai là biến y, và đối số thứ ba là bậc khớp (1 cho tuyến tính). Phương thức thứ hai trả về một lớp đa thức một chiều mà ta có thể dùng để tạo đường xu hướng bằng plt.plot().
z = np.polyfit(djia_data['Open'], djia_data['Close'], 1)
p = np.poly1d(z)
plt.scatter(djia_data['Open'], djia_data['Close'])
plt.plot(djia_data['Open'], p(djia_data['Open']))
plt.show()

Như ta thấy, đường nền trên đồ thị bám sát xu hướng của các điểm phân tán vì mối quan hệ giữa giá mở và giá đóng là rất tuyến tính. Khi giá mở tăng, giá đóng thường tăng với tốc độ tương tự và tuyến tính.
Đặt tiêu đề biểu đồ và nhãn trục
Tiêu đề và nhãn trục giúp người xem hiểu họ đang nhìn dữ liệu gì. Matplotlib cung cấp plt.title(), plt.xlabel(), và plt.ylabel() để chú thích biểu đồ. Dưới đây là biểu đồ phân tán trước đó với cả ba thành phần được thêm vào:
plt.scatter(djia_data['Open'], djia_data['Close'])
plt.title('DJIA 2022: Open vs. Close Price')
plt.xlabel('Open Price ($)')
plt.ylabel('Close Price ($)')
plt.show()

Thay đổi màu sắc
Lựa chọn màu ảnh hưởng đến khả năng đọc và điểm nhấn. Trong Matplotlib, có ba cách chỉ định màu:
-
Màu đặt tên sẵn:
"red","blue","steelblue" -
Mã hex:
"#f4db9a","#383c4a" -
Bộ ba RGB:
(0.49, 0.39, 0.15),(0.12, 0.21, 0.47)
Đổi màu đường
Với biểu đồ đường, ta có thể đổi màu bằng thuộc tính color trong plt.plot(). Bên dưới, ta đổi màu đường giá mở cửa thành “black” và đường giá đóng cửa thành “red”.
plt.plot(djia_data['Date'], djia_data['Open'], color = 'black')
plt.plot(djia_data['Date'], djia_data['Close'], color = 'red')
plt.show()

Đổi màu cột
Với cột, ta có thể truyền một danh sách vào thuộc tính color để chỉ định màu cho từng cột. Giả sử ta muốn làm nổi bật giá trung bình tháng Giêng để nhấn mạnh mức giá đóng cửa trung bình mạnh. Ta có thể làm thế bằng cách gán cho cột đó một màu riêng để thu hút sự chú ý.
plt.bar(djia_monthly_mean_srtd['Month'], height = djia_monthly_mean_srtd['Close'], color = ['blue', 'gray', 'gray', 'gray', 'gray', 'gray'])
plt.show()

Đổi màu điểm
Cuối cùng, với biểu đồ phân tán, ta có thể đổi màu bằng thuộc tính color của plt.scatter(). Ta sẽ tô màu tất cả điểm trong tháng Giêng là xanh lam và các điểm khác là xám để kể câu chuyện tương tự như hình trên.
plt.scatter(djia_data[djia_data['Month'] == 'January']['Open'], djia_data[djia_data['Month'] == 'January']['Close'], color = 'blue')
plt.scatter(djia_data[djia_data['Month'] != 'January']['Open'], djia_data[djia_data['Month'] != 'January']['Close'], color = 'gray')
plt.show()

Sử dụng bản đồ màu (Colormap)
Bản đồ màu là các thang màu dựng sẵn của Matplotlib ánh xạ giá trị số lên một dải màu chuyển sắc (tài liệu chính thức). Để xem chi tiết hơn, hãy xem hướng dẫn Matplotlib Colormaps. Các bản đồ màu thường có tính thẩm mỹ đồng bộ và giúp kể câu chuyện về giá trị tăng dần.
Trong ví dụ dưới đây, ta dùng một bản đồ màu bằng cách truyền giá đóng cửa (biến y) vào thuộc tính c, và bản đồ màu plasma qua cmap. Ta thấy khi giá trị tăng, màu tương ứng sáng hơn và ngả vàng, trong khi giá trị thấp ở phía tím và tối hơn.
plt.scatter(djia_data['Open'], djia_data['Close'], c=djia_data['Close'], cmap = plt.cm.plasma)
plt.show()
Đặt giới hạn trục
Đôi khi, việc quan sát một khoảng giá trị cụ thể trên biểu đồ sẽ hữu ích. Ví dụ, nếu DJIA hiện giao dịch quanh mức $30.000, ta có thể chỉ quan tâm đến hành vi quanh mức giá đó. Ta có thể truyền một bộ (tuple) vào plt.xlim() và plt.ylim() để đặt lần lượt các giới hạn x và y. Giá trị đầu trong bộ là giới hạn dưới, và giá trị thứ hai là giới hạn trên.
plt.scatter(djia_data['Open'], djia_data['Close'])
plt.xlim((29000, 34000))
plt.ylim((29000, 34000))
plt.title('DJIA Open vs Close (Zoomed In)')
plt.xlabel('Open Price ($)')
plt.ylabel('Close Price ($)')
plt.show()
Lưu biểu đồ
Khi đã có biểu đồ ưng ý, bạn có thể lưu ra tệp. Matplotlib hỗ trợ PNG, PDF, SVG và định dạng khác qua plt.savefig(). Định dạng được suy ra từ phần mở rộng tệp.
Cuối cùng, ta có thể lưu các biểu đồ tạo bằng matplotlib với phương thức plt.savefig(). Ta có thể lưu ở nhiều định dạng tệp khác nhau bao gồm ‘png’, ‘pdf’ và ‘svg’. Đối số đầu là tên tệp. Định dạng được suy ra từ phần mở rộng tệp (hoặc bạn có thể ghi đè bằng tham số format).
plt.scatter(djia_data['Open'], djia_data['Close'])
plt.savefig('DJIA 2022 Scatterplot Open vs. Close.png')
Kết luận
Hướng dẫn này đã bao quát biểu đồ đường, cột và phân tán — ba loại biểu đồ bạn sẽ thường xuyên dùng nhất. Matplotlib cần nhiều mã hơn so với các thư viện mức cao như Seaborn hay Plotly, nhưng sự “dài dòng” đó mang lại cho bạn quyền kiểm soát đến từng pixel của mọi thành phần trong hình.
Từ đây, tôi khuyến nghị bạn khám phá thêm histogram, biểu đồ tròn, và bản đồ màu cho các bước tiếp theo. Nếu muốn một lộ trình có cấu trúc, khóa học Giới thiệu Trực quan hóa Dữ liệu với Matplotlib sẽ hướng dẫn về subplot, tạo phong cách và chia sẻ hình trong bốn giờ.
Câu hỏi thường gặp về Matplotlib
Matplotlib trong Python là gì?
Matplotlib là một thư viện trực quan hóa dữ liệu phổ biến trong Python. Nó thường được dùng để tạo các trực quan hóa tĩnh, tương tác và động trong Python. Matplotlib cho phép bạn tạo biểu đồ, histogram, biểu đồ cột, biểu đồ phân tán, v.v. chỉ với vài dòng mã.
Tại sao tôi nên dùng Matplotlib để trực quan hóa dữ liệu?
Có vài lý do. Thứ nhất, Matplotlib linh hoạt. Nó hỗ trợ nhiều loại đồ thị và biểu đồ, và tích hợp tốt với nhiều thư viện Python khác như NumPy và pandas. Thứ hai, đây là một thư viện lâu đời và được dùng rộng rãi, nên có cộng đồng mạnh cùng nhiều tài nguyên và hướng dẫn. Cuối cùng, vì viết bằng Python, bạn có thể tự động hóa và tùy biến biểu đồ như một phần của pipeline dữ liệu.
Làm thế nào để cài đặt Matplotlib?
Bạn có thể cài đặt Matplotlib bằng pip, bộ cài gói của Python. Mở terminal và gõ: pip install matplotlib. Nếu bạn dùng Jupyter notebook, bạn có thể chạy lệnh này trong một ô mã bằng cách thêm dấu chấm than phía trước: !pip install matplotlib.
Làm sao để tạo một biểu đồ cơ bản trong Matplotlib?
Dưới đây là một ví dụ đơn giản. Trước tiên, bạn cần import thư viện Matplotlib. Mô-đun được dùng nhiều nhất là pyplot, thường được import với bí danh plt:
import matplotlib.pyplot as plt
Sau đó bạn có thể tạo một biểu đồ đường cơ bản như sau:
plt.plot([1, 2, 3, 4]) plt.ylabel('Some Numbers') plt.show()
Trong ví dụ này, plt.plot([1, 2, 3, 4]) được dùng để vẽ danh sách số đã chỉ định. Dòng plt.ylabel('Some Numbers') đặt nhãn cho trục y, và plt.show() hiển thị biểu đồ.
Tác giả về Khoa học Dữ liệu | Chuyên viên Phân tích Tiếp thị Kỹ thuật Cấp cao tại Wayfair | Thạc sĩ Khoa học Dữ liệu tại University of Pennsylvania

