Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Hướng dẫn vẽ biểu đồ tròn (pie chart) làm nổi bật một phần với Matplotlib Python

Giới thiệu

Biểu đồ tròn (pie chart) là cách phổ biến thể hiện tỷ lệ phần trăm. Matplotlib cho phép làm nổi bật một phần (explode), hiển thị giá trị thực thay vì phần trăm, tùy chỉnh góc xoay, v.v.

Cài đặt

pip install matplotlib

Dữ liệu mẫu

tennis_stats = (
    ('Federer', 20),
    ('Nadal', 20),
    ('Djokovic', 17),
    ('Murray', 3),
)

Biểu đồ tròn cơ bản

import matplotlib.pyplot as plt

titles = [t for _, t in tennis_stats]
players = [p for p, _ in tennis_stats]

plt.pie(titles, labels=players, autopct='%1.1f%%')
plt.gca().axis('equal')  # Đảm bảo tròn trơn
plt.show()

Tùy chỉnh góc xoay và chiều

plt.pie(titles, labels=players, 
        startangle=60,           # Xoay bắt đầu 60 độ
        counterclock=False,      # Chiều kim đồng hồ
        autopct='%1.1f%%')
plt.show()

Làm nổi bật một phần (explode)

Tham số explode là tuple cùng độ dài dữ liệu, giá trị > 0 sẽ tách phần đó ra xa tâm.

explode = (0, 0, 0.1, 0)  # Tách phần Djokovic (index 2)
plt.pie(titles, labels=players, explode=explode, autopct='%1.1f%%')
plt.show()

Hiển thị giá trị thực thay vì phần trăm

Dùng autopct với function tùy chỉnh:

from matplotlib.ticker import FuncFormatter

total = sum(titles)
# Map phần trăm nguyên → giá trị thực
values = {int(100 * t / total): t for _, t in tennis_stats}

def format_values(pct, **kwargs):
    return str(values.get(int(pct), ''))

explode = (0, 0, 0.1, 0)
plt.pie(titles, labels=players, explode=explode, autopct=format_values)
plt.show()

Code hoàn chỉnh

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

tennis_stats = (('Federer', 20), ('Nadal', 20), ('Djokovic', 17), ('Murray', 3))
titles = [t for _, t in tennis_stats]
players = [p for p, _ in tennis_stats]

total = sum(titles)
values = {int(100 * t / total): t for _, t in tennis_stats}

def format_values(pct, **kwargs):
    return str(values.get(int(pct), ''))

explode = (0, 0, 0.1, 0)
plt.pie(titles, labels=players, explode=explode, autopct=format_values)
plt.title('Grand Slam Titles')
plt.show()

Kết quả

Biểu đồ tròn với phần Djokovic tách ra, hiển thị số lượng titles thực (20, 20, 17, 3) thay vì phần trăm.