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

Hướng dẫn vẽ scatter plot 4D với màu và kích thước tùy chỉnh Matplotlib Python

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 s tí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.