Học kì 1, năm học 2026–2027
Viện Trí tuệ nhân tạo, Trường ĐH Công nghệ, ĐHQGHN
matplotlib, pandas plot và cách tạo biểu đồ tự giải thích được.
.plot và xuất hình từ pipelinedescribe() không cho biết hình dạng của dữ liệu.
| Bạn muốn nhìn thấy… | Chọn biểu đồ dạng… | Ví dụ trong bài này |
|---|---|---|
| Diễn biến theo thời gian | đường (line) | đánh giá theo tháng |
| So sánh giữa các nhóm | cột (bar; dùng thanh ngang nếu tên dài) | giá theo quận |
| Hình dáng phân phối | histogram | phân phối giá |
| Quan hệ hai đại lượng | phân tán (scatter) | vị trí × giá |
Chọn dạng biểu đồ dựa trên câu hỏi phân tích. Nếu chỉ cần nhấn mạnh một con số thì không cần vẽ biểu đồ.
Giao diện lập trình chung cho nhiều dạng biểu đồ.
fig và ax
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 4)) # tờ giấy + khung vẽ
ax.plot(thang.index, thang.values) # vẽ lên khung
ax.set_title("...")
ax.set_ylabel("số đánh giá / tháng")
plt.show()
# bỏ tháng 06/2026 chưa trọn
thang = (rv.set_index("date")
.resample("ME").size()
.loc["2023":"2026-05"])
fig, ax = plt.subplots()
ax.plot(thang.index,
thang.values,
color="#1E93AB",
lw=2)
Kết quả tổng hợp theo tháng ở bài 8 được dùng trực tiếp để vẽ biểu đồ.
top = (tk[tk["n"] >= 500]
.nlargest(8, "median")
.sort_values("median"))
bars = ax.barh(top.index,
top["median"])
ax.bar_label(bars, ...)
Thanh ngang giúp đọc tên quận dễ hơn. bar_label ghi giá trị
trực tiếp; màu cam chỉ dùng cho nhóm cần nhấn mạnh.
ax.hist(np.log10(gia),
bins=55)
ax.set_xlabel(
"log10(giá CLP/đêm)")
Thang log giúp quan sát rõ phân phối giá. Số khoảng bins
quá ít làm mất cấu trúc; quá nhiều làm tăng nhiễu.
mau = np.where(
s["price"] > median,
"#E8890C", "#1E93AB")
ax.scatter(s["longitude"],
s["latitude"],
s=6, c=mau,
# 0 trong→1 đục
alpha=0.45)
Kinh độ, vĩ độ và hai nhóm màu tạo thành một bản đồ điểm đơn giản.
alpha=0.45 — độ trong suốt thấp — giúp hạn chế hiện tượng các điểm che lấp nhau.
subplots: đặt hai vùng vẽ cạnh nhau
fig, axes = plt.subplots(1, 2, figsize=(10, 4), sharey=True)
axes[0].hist(gia_t9, bins=40)
axes[0].set_title("09/2025")
axes[1].hist(gia_t6, bins=40)
axes[1].set_title("06/2026")
Khi so sánh hai mốc chụp, sharey=True dùng chung thang đo, tránh tạo ấn tượng sai do hai trục khác nhau.
Vẽ nhanh khi khám phá dữ liệu.
.plot: vẽ nhanh khi khám phá dữ liệu
thang.plot() # đường
df["room_type"].value_counts().plot.barh() # thanh ngang
df["price"].plot.hist(bins=50) # histogram
pandas cũng gọi matplotlib và tự tạo các thành phần mặc định.
.plot phù hợp để khám phá nhanh dữ liệu; fig, ax phù hợp với hình chất lượng cao đưa vào báo cáo.
savefig: xuất hình từ pipeline
fig.savefig("figures/gia_theo_quan.png",
dpi=150, bbox_inches="tight")
figures/ khi chạy pipeline.
Khi cần sửa hình, hãy sửa mã nguồn và chạy lại thay vì chỉnh tay hoặc chụp màn hình.
# matplotlib chọn định dạng theo đuôi file
fig.savefig("line.svg") # cho web
fig.savefig("bao_cao.pdf") # cho báo cáo
fig.savefig("map.png", dpi=150) # ảnh raster
Ảnh raster như PNG lưu một lưới điểm ảnh (pixel); phóng to sẽ vỡ, dung lượng
nặng theo số điểm ảnh — nên dpi chỉ có nghĩa với ảnh raster. Ảnh vector như
SVG và PDF lưu đường nét và chữ; phóng bao nhiêu cũng nét,
dung lượng nặng theo số đối tượng vẽ.
| Hình | PNG | SVG |
|---|---|---|
| Đường, ~41 điểm | 48 KB | 23 KB |
| Phân tán, 18.000 điểm | 156 KB | ~2,7 MB |
PDF cũng là ảnh vector, dùng cho báo cáo và in ấn: 6 KB cho biểu đồ đường, 296 KB cho bản đồ điểm.
rcParams: khai báo phong cách một lần
plt.rcParams.update({
"figure.facecolor": "white",
"axes.spines.top": False, "axes.spines.right": False,
"axes.grid": True, "grid.alpha": 0.25,
"font.size": 12,
})
Khai báo một lần ở đầu notebook hoặc script để mọi hình có cùng phong cách. Tính nhất quán của các biểu đồ trong báo cáo là một tiêu chí quan trọng.
Cách trình bày có thể khiến người đọc hiểu sai dù số liệu đúng.
fig, ax cùng biểu đồ đường, cột, histogram và phân tán đáp ứng phần lớn nhu cầu cơ bản..plot dùng để khám phá; savefig và rcParams hỗ trợ xuất hình nhất quán.nlargest.