Cheat sheet Matplotlib
Cập nhật lần cuối
Figure và axes
Figure là toàn bộ hình ảnh. Axes là một biểu đồ nằm trong đó, và gần như mọi lệnh dưới đây là phương thức của ax.
| Việc cần làm | Code |
|---|---|
| Import thư viện pyplot | import matplotlib.pyplot as plt |
| Một figure với một biểu đồ | fig, ax = plt.subplots() |
| Đặt kích thước theo inch | fig, ax = plt.subplots(figsize=(8, 4)) |
| Vẽ lên axes | ax.plot(x, y) |
| Hiển thị figure | plt.show() |
| Lưu thành PNG sắc nét | fig.savefig("chart.png", dpi=150, bbox_inches="tight") |
| Lưu dạng đồ họa vector | fig.savefig("chart.svg"), fig.savefig("chart.pdf") |
| Nền trong suốt | fig.savefig("chart.png", transparent=True) |
| Đóng figure để giải phóng bộ nhớ | plt.close(fig) |
| Kiểu pyplot nhanh cho một biểu đồ | plt.plot(x, y)
plt.title("Quick look")
plt.show() |
Các loại biểu đồ
| Việc cần làm | Code |
|---|---|
| Biểu đồ đường | ax.plot(x, y) |
| Biểu đồ phân tán | ax.scatter(x, y, s=20, alpha=0.7) |
| Biểu đồ phân tán tô màu theo giá trị, kèm thanh màu | points = ax.scatter(x, y, c=y, cmap="viridis")
fig.colorbar(points, ax=ax) |
| Biểu đồ cột | ax.bar(cats, a) |
| Biểu đồ cột ngang | ax.barh(cats, a) |
| Cột chồng | ax.bar(cats, a, label="2025")
ax.bar(cats, b, bottom=a, label="2026") |
| Cột nhóm | pos = np.arange(len(cats))
ax.bar(pos - 0.2, a, width=0.4)
ax.bar(pos + 0.2, b, width=0.4)
ax.set_xticks(pos, labels=cats) |
| Biểu đồ histogram | ax.hist(data, bins=30) |
| Biểu đồ hộp (box plot) | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) |
| Biểu đồ violin | ax.violinplot([data, data * 2]) |
| Biểu đồ tròn | ax.pie([40, 35, 25], labels=cats, autopct="%1.0f%%") |
| Dải giữa hai đường cong | ax.fill_between(x, y - 0.2, y + 0.2, alpha=0.3) |
| Thanh sai số | ax.errorbar([1, 2, 3], [4, 5, 3], yerr=[0.5, 0.3, 0.6], fmt="o", capsize=4) |
| Biểu đồ bậc thang | ax.step(x, y, where="mid") |
| Heatmap của mảng 2 chiều | image = ax.imshow(np.random.default_rng(0).random((5, 5)), cmap="magma")
fig.colorbar(image, ax=ax) |
| Biểu đồ đường đồng mức tô màu | X, Y = np.meshgrid(x, x)
ax.contourf(X, Y, np.sin(X) * np.cos(Y), levels=20) |
| Mật độ của nhiều điểm | ax.hexbin(data, data + np.random.default_rng(1).normal(size=200), gridsize=20) |
| Đường tham chiếu ngang hoặc dọc | ax.axhline(0, color="gray", linestyle="--"), ax.axvline(5) |
| Tô một khoảng | ax.axvspan(2, 4, alpha=0.2) |
Đường, điểm đánh dấu và màu sắc
| Việc cần làm | Code |
|---|---|
| Màu, độ dày và kiểu đường | ax.plot(x, y, color="tab:red", linewidth=2, linestyle="--") |
| Đánh dấu các điểm | ax.plot(x, y, marker="o", markersize=4) |
| Chuỗi định dạng viết tắt | ax.plot(x, y, "g--o") |
| Độ trong suốt | ax.plot(x, y, alpha=0.5) |
| Kiểu đường | "-", "--", "-.", ":" |
| Mã điểm đánh dấu | "o", "s", "^", "x", ".", "*" |
| Các cách gọi tên màu | "tab:blue", "C1", "#1f77b4", (0.2, 0.4, 0.6) |
| n màu từ một colormap | colors = plt.colormaps["viridis"](np.linspace(0, 1, 5)) |
| Chu kỳ màu của riêng bạn | ax.set_prop_cycle(color=["#0b7285", "#e8590c", "#5f3dc4"]) |
| Cột có viền và gạch chéo | ax.bar(cats, a, color="white", edgecolor="black", hatch="//") |
Tiêu đề, nhãn và chú giải
| Việc cần làm | Code |
|---|---|
| Tiêu đề và nhãn trục | ax.set_title("Sales"), ax.set_xlabel("Month"), ax.set_ylabel("EUR") |
| Tất cả trong một lệnh | ax.set(title="Sales", xlabel="Month", ylabel="EUR") |
| Chú giải từ nhãn của đường | ax.plot(x, y, label="sin")
ax.legend() |
| Vị trí và số cột của chú giải | ax.legend(loc="upper right", ncols=2, frameon=False) |
| Chú giải nằm ngoài biểu đồ | ax.legend(loc="center left", bbox_to_anchor=(1, 0.5)) |
| Chữ tại một vị trí dữ liệu | ax.text(5, 0.5, "note") |
| Chú thích kèm mũi tên | ax.annotate("peak", xy=(1.57, 1), xytext=(3, 1.2), arrowprops=dict(arrowstyle="->")) |
| Nhãn giá trị trên cột | bars = ax.bar(cats, a)
ax.bar_label(bars) |
| Tiêu đề cho cả figure | fig.suptitle("Q1 report") |
| Công thức toán trong nhãn | ax.set_xlabel(r"$\alpha$ (rad)") |
Trục, vạch chia và thang đo
| Việc cần làm | Code |
|---|---|
| Giới hạn trục | ax.set_xlim(0, 10), ax.set_ylim(bottom=0) |
| Thang logarit | ax.set_yscale("log") |
| Chọn vạch chia và nhãn của chúng | ax.set_xticks([0, 5, 10], labels=["start", "middle", "end"]) |
| Xoay nhãn vạch chia | ax.tick_params(axis="x", labelrotation=45) |
| Đường lưới | ax.grid(True, alpha=0.3) |
| Trục phần trăm | from matplotlib.ticker import PercentFormatter
ax.yaxis.set_major_formatter(PercentFormatter(1.0)) |
| Dấu phân cách hàng nghìn | ax.yaxis.set_major_formatter("{x:,.0f}") |
| Ẩn viền trên và viền phải | ax.spines[["top", "right"]].set_visible(False) |
| Trục y thứ hai bên phải | ax2 = ax.twinx()
ax2.plot(x, y * 100, color="tab:orange") |
| Cùng tỷ lệ trên hai trục | ax.set_aspect("equal") |
| Đảo ngược một trục | ax.invert_yaxis() |
| Ẩn hoàn toàn các trục | ax.axis("off") |
| Nhãn ngày dễ đọc | fig.autofmt_xdate() |
Subplot và bố cục
plt.subplots(rows, cols) trả về một mảng NumPy chứa các axes. Truy cập nó theo chỉ số như một mảng.
| Việc cần làm | Code |
|---|---|
| Lưới biểu đồ | fig, axs = plt.subplots(2, 2, figsize=(8, 6)) |
| Vẽ lên một ô trong lưới | axs[0, 1].plot(x, y) |
| Lặp qua tất cả các ô | for ax in axs.flat:
ax.grid(True) |
| Dùng chung một trục giữa các biểu đồ | fig, axs = plt.subplots(1, 3, sharey=True) |
| Khoảng cách tránh bị chồng lên nhau | fig, axs = plt.subplots(2, 2, layout="constrained") |
| Sửa chỗ chồng nhau sau khi vẽ | fig.tight_layout() |
| Các cột có độ rộng khác nhau | fig, axs = plt.subplots(1, 2, width_ratios=[3, 1]) |
| Bố cục có tên với một ô rộng | fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]])
axd["top"].plot(x, y) |
| Biểu đồ nhỏ bên trong một biểu đồ | inset = ax.inset_axes([0.6, 0.6, 0.35, 0.35]) |
| Ẩn một ô trống | axs[0].axis("off") |
Style và giá trị mặc định
| Việc cần làm | Code |
|---|---|
| Dùng một style có sẵn | plt.style.use("ggplot") |
| Liệt kê các style | plt.style.available |
| Giao diện kiểu seaborn mà không cần seaborn | plt.style.use("seaborn-v0_8-whitegrid") |
| Style chỉ cho một figure | with plt.style.context("dark_background"):
fig, ax = plt.subplots() |
| Cỡ chữ mặc định | plt.rcParams["font.size"] = 12 |
| Kích thước và độ phân giải mặc định của figure | plt.rcParams["figure.figsize"] = (8, 4), plt.rcParams["figure.dpi"] = 120 |
| Trở về mặc định | plt.style.use("default") |
| Các colormap thường dùng: tuần tự, phân kỳ, xám | "viridis", "coolwarm", "Greys" |
Vẽ biểu đồ từ pandas
pandas vẽ biểu đồ bằng Matplotlib. Truyền ax= để vẽ vào axes của bạn, hoặc giữ lại ax mà pandas trả về.
| Việc cần làm | Code |
|---|---|
| Vẽ các cột DataFrame vào axes của bạn | df.plot(x="month", y="sales", ax=ax) |
| Biểu đồ cột của bảng tổng hợp theo nhóm | df.groupby("city")["sales"].sum().plot.bar(ax=ax) |
| Tiếp tục chỉnh style cho biểu đồ pandas đã vẽ | ax = df.plot(x="month", y="sales")
ax.set_title("Sales") |
| Đưa các cột thẳng vào Matplotlib | ax.plot(df["month"], df["sales"]) |
Matplotlib 3.11: cách viết cũ và cách viết hiện nay
Code sao chép từ các hướng dẫn cũ có thể lỗi hoặc hiện cảnh báo trong Matplotlib 3.11. Hãy viết theo cột Matplotlib 3.11.
| Việc cần làm | Matplotlib 3.11 | Cách viết cũ |
|---|---|---|
| Nhãn của box plot | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) | labels=["A", "B"] |
| Box plot hoặc violin plot nằm ngang | ax.boxplot(data, orientation="horizontal") | vert=False |
| Lấy một colormap | plt.colormaps["viridis"] | plt.cm.get_cmap("viridis") |
| Style seaborn | plt.style.use("seaborn-v0_8") | plt.style.use("seaborn") |
Những đoạn code Matplotlib bạn cần để biến dữ liệu thành một biểu đồ rõ ràng, chia theo từng việc: figure và axes, các loại biểu đồ, đường và màu sắc, tiêu đề và chú giải, trục và vạch chia, subplot và bố cục, style, và vẽ biểu đồ từ pandas. Mỗi dòng là một đoạn code ngắn bạn có thể dán vào, kèm một câu giải thích nó làm gì.
Mọi thứ ở đây dùng phong cách hướng đối tượng (fig, ax = plt.subplots(), rồi gọi phương thức trên ax) và viết cho Matplotlib 3.11, phiên bản Coddy đang chạy. Các cách viết cũ như labels= trong boxplot chỉ xuất hiện ở bảng cuối cùng, cạnh cách viết nên dùng thay thế. Các ví dụ dùng x = np.linspace(0, 10, 50), y = np.sin(x) và một mẫu giá trị phân phối chuẩn tên là data. Bạn mới bắt đầu với Python? Hãy xem cheat sheet Python trước, và mở các cheat sheet pandas, NumPy và scikit-learn bên cạnh trang này.
Câu hỏi thường gặp về cheat sheet Matplotlib
Cheat sheet Matplotlib này có miễn phí không?
Có. Cheat sheet Matplotlib này hoàn toàn miễn phí, không cần đăng ký. Lưu trang lại hoặc in ra PDF từ trình duyệt, rồi quay lại bất cứ khi nào bạn cần đúng lệnh cho chú giải, lưới subplot hay thanh màu.
plt và ax khác nhau thế nào?
plt.plot() vẽ lên axes hiện tại, rất nhanh khi chỉ có một biểu đồ. fig, ax = plt.subplots() cho bạn figure và axes ở dạng đối tượng, nên ax.plot() luôn vẽ đúng chỗ bạn muốn. Hãy dùng kiểu ax cho mọi thứ có nhiều hơn một biểu đồ, và cho code bạn sẽ giữ lại lâu dài.Làm sao đổi kích thước figure?
figsize tính bằng inch khi tạo figure: fig, ax = plt.subplots(figsize=(10, 5)). Để đổi giá trị mặc định cho mọi figure, đặt plt.rcParams["figure.figsize"] = (10, 5). Kích thước pixel của tệp được lưu bằng figsize nhân với dpi.Làm sao lưu biểu đồ với độ phân giải cao?
fig.savefig("chart.png", dpi=300, bbox_inches="tight"). dpi càng cao thì PNG càng sắc nét, còn bbox_inches="tight" cắt bỏ lề trống. Để in hoặc đưa vào slide, lưu dạng SVG hoặc PDF, sắc nét ở mọi kích thước.Vì sao tiêu đề và nhãn của các subplot bị chồng lên nhau?
layout="constrained", như plt.subplots(2, 2, layout="constrained"), và Matplotlib sẽ chừa chỗ cho tiêu đề, nhãn và thanh màu. Với một figure đã có, gọi fig.tight_layout() sau khi vẽ.Cheat sheet này dành cho phiên bản Matplotlib nào?
labels= trong boxplot (nay là tick_labels=) và plt.cm.get_cmap (nay là plt.colormaps[...]), nằm ở bảng cuối cùng, cạnh cách viết nên dùng thay thế.