Giới thiệu
Scatter plot (biểu đồ phân tán) thường dùng 2 chiều (X, Y). Matplotlib cho phép thêm chiều thứ 3 (kích thước điểm - s) và chiều thứ 4 (màu sắc - c), tạo thành biểu đồ 4D.
Cài đặt
pip install matplotlib
Dữ liệu mẫu
tennis_stats = (
('Federer', 20), ('Nadal', 20), ('Djokovic', 17), ('Sampras', 14),
('Emerson', 12), ('Laver', 11), ('Murray', 3), ('Wawrinka', 3),
('Zverev', 0), ('Thiem', 1), ('Medvedev', 0), ('Tsitsipas', 0),
('Dimitrov', 0), ('Rublev', 0)
)
Scatter plot cơ bản
import matplotlib.pyplot as plt
titles = [t for _, t in tennis_stats]
players = [p for p, _ in tennis_stats]
plt.scatter(titles, players)
plt.xlabel('Grandslam Titles')
plt.ylabel('Tennis Player')
plt.show()
Định dạng trục X thành số nguyên
from matplotlib.ticker import FuncFormatter
def format_titles(val, pos):
return f'{int(val)}'
plt.gca().xaxis.set_major_formatter(FuncFormatter(format_titles))
Thêm màu sắc ngẫu nhiên (chiều thứ 4)
import random
random_colors = ['#FF0000', '#FFFF00', '#FFFFF0', '#FFFFFF', '#00000F']
colors = [random.choice(random_colors) for _ in range(len(titles))]
plt.scatter(titles, players, c=colors, alpha=0.5)
plt.show()
Thêm kích thước điểm ngẫu nhiên (chiều thứ 3)
sizes = [(50 * random.random()) ** 2 for _ in range(len(titles))]
plt.scatter(titles, players, c=colors, s=sizes, alpha=0.1)
plt.show()
Code hoàn chỉnh
import matplotlib.pyplot as plt
import random
from matplotlib.ticker import FuncFormatter
tennis_stats = (
('Federer', 20), ('Nadal', 20), ('Djokovic', 17), ('Sampras', 14),
('Emerson', 12), ('Laver', 11), ('Murray', 3), ('Wawrinka', 3),
('Zverev', 0), ('Thiem', 1), ('Medvedev', 0), ('Tsitsipas', 0),
('Dimitrov', 0), ('Rublev', 0)
)
titles = [t for _, t in tennis_stats]
players = [p for p, _ in tennis_stats]
def format_titles(val, pos):
return f'{int(val)}'
random_colors = ['#FF0000', '#FFFF00', '#FFFFF0', '#FFFFFF', '#00000F']
colors = [random.choice(random_colors) for _ in range(len(titles))]
sizes = [(50 * random.random()) ** 2 for _ in range(len(titles))]
plt.gca().xaxis.set_major_formatter(FuncFormatter(format_titles))
plt.xlabel('Grandslam Titles')
plt.ylabel('Tennis Player')
plt.scatter(titles, players, c=colors, s=sizes, alpha=0.1)
plt.title('Tennis Players: Titles vs Random Size/Color')
plt.show()
Mẹo nâng cao
- Dùng
cmap(colormap) thay vì màu ngẫu nhiên để màu phản ánh giá trị dữ liệu. - Kích thước
stính theo điểm2 (points squared). alpha(0-1) điều chỉnh độ trong suốt, hữu ích khi điểm chồng chéo.- Có thể gán màu theo size:
c=sizes, cmap='viridis'để cùng size = cùng màu.
Độ phức tạp
- Thời gian vẽ: O(n) với n số điểm.
- Phù hợp cho vài trăm đến vài nghìn điểm.