# Python中如何使用matplotlib制作雷達圖進行對比分析
## 一、雷達圖簡介與適用場景
### 1.1 什么是雷達圖
雷達圖(Radar Chart),又稱蜘蛛網圖(Spider Chart)或星狀圖(Star Plot),是一種以從同一點開始的軸上表示的三個或更多個定量變量的二維圖表形式。它由多個等角度分布的軸組成,每個軸代表一個變量,數據點通過折線連接形成多邊形。
### 1.2 雷達圖的優勢特點
- **多維度對比**:可同時展示5-8個維度的數據對比
- **直觀性強**:通過形狀面積和頂點位置快速識別數據特征
- **異常檢測**:明顯凸起或凹陷可直觀反映指標異常
- **整體評估**:適合展示綜合能力或性能的平衡性
### 1.3 典型應用場景
1. 員工能力評估(技術能力、溝通能力等多維度)
2. 產品特性對比(不同產品的性能參數比較)
3. 游戲角色屬性分析(力量、敏捷、智力等屬性)
4. 企業競爭力評估(財務、客戶、運營等多維度)
## 二、Matplotlib基礎與雷達圖繪制原理
### 2.1 Matplotlib簡介
Matplotlib是Python最著名的2D繪圖庫,提供類似MATLAB的繪圖框架,支持多種圖形輸出格式和交互式環境。
安裝命令:
```python
pip install matplotlib numpy
雷達圖本質上是繪制在極坐標系(Polar Coordinates)中的折線圖: - 角度軸:表示不同的維度/指標 - 徑向軸:表示指標數值大小 - 多邊形:連接各維度數據點形成
import numpy as np
import matplotlib.pyplot as plt
# 準備數據
categories = ['速度', '力量', '耐力', '敏捷', '智力']
values = [4, 3, 5, 2, 4]
N = len(categories)
# 計算角度
angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist()
values += values[:1] # 閉合圖形
angles += angles[:1]
# 創建極坐標圖
fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(polar=True))
# 繪制填充區域
ax.fill(angles, values, 'b', alpha=0.2)
# 繪制數據線
ax.plot(angles, values, 'bo-', linewidth=2)
# 設置刻度標簽
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
# 設置徑向刻度
ax.set_rlabel_position(30)
plt.yticks([1,2,3,4,5], ["1","2","3","4","5"], color="grey", size=7)
ax.set_ylim(0,5)
plt.title('基礎雷達圖示例', size=15, y=1.1)
plt.show()
np.linspace:將圓周等分為N份subplot_kw=dict(polar=True):創建極坐標子圖fill()方法:填充多邊形區域set_xticks():設置維度標簽位置set_rlabel_position():設置徑向標簽位置# 準備對比數據
player1 = [4, 3, 5, 2, 4]
player2 = [3, 4, 2, 5, 3]
N = len(categories)
angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist()
player1 += player1[:1]
player2 += player2[:1]
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8,8), subplot_kw=dict(polar=True))
# 繪制兩組數據
ax.plot(angles, player1, 'bo-', linewidth=2, label='選手A')
ax.fill(angles, player1, 'b', alpha=0.2)
ax.plot(angles, player2, 'ro-', linewidth=2, label='選手B')
ax.fill(angles, player2, 'r', alpha=0.2)
# 設置標簽和樣式
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_rlabel_position(0)
plt.yticks([1,2,3,4,5], ["1","2","3","4","5"], color="grey", size=7)
ax.set_ylim(0,5)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.title('選手能力對比雷達圖', size=15, y=1.1)
plt.show()
# 準備三組數據
data = {
'產品A': [8, 6, 7, 5, 9, 6],
'產品B': [5, 9, 6, 8, 4, 7],
'產品C': [7, 5, 8, 6, 7, 8]
}
categories = list(data.keys())
labels = ['設計', '性能', '續航', '價格', '服務', '生態']
# 創建畫布
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, polar=True)
# 計算角度
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
# 繪制每組數據
for name, values in data.items():
values += values[:1]
_angles = angles + angles[:1]
ax.plot(_angles, values, 'o-', linewidth=2, label=name)
ax.fill(_angles, values, alpha=0.1)
# 設置標簽
ax.set_xticks(angles)
ax.set_xticklabels(labels)
ax.set_rlabel_position(30)
plt.yticks(np.arange(1,10), [str(i) for i in range(1,10)])
ax.set_ylim(0,10)
plt.title('三款產品對比雷達圖', size=15, y=1.1)
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.show()
# 自定義顏色和樣式
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
line_styles = ['-', '--', ':']
for idx, (name, values) in enumerate(data.items()):
values += values[:1]
ax.plot(angles + angles[:1], values,
color=colors[idx],
linestyle=line_styles[idx],
linewidth=2,
marker='o',
markersize=6,
label=name)
# 設置網格樣式
ax.xaxis.grid(True, color='grey', linestyle='-', linewidth=0.5)
ax.yaxis.grid(True, color='grey', linestyle='--', linewidth=0.5)
# 設置背景
ax.set_facecolor('#f5f5f5')
# 在頂點添加數值標簽
for angle, value, label in zip(angles, values[:-1], labels):
ax.text(angle, value+0.5, str(value),
ha='center', va='center',
fontsize=10, fontweight='bold')
# 自定義徑向刻度
custom_ticks = [0, 3, 6, 9]
ax.set_yticks(custom_ticks)
ax.set_yticklabels([f'Level {i}' for i in custom_ticks], fontsize=8)
employees = {
'張三': {'技術':8, '溝通':6, '創新':7, '執行力':9, '學習':8},
'李四': {'技術':6, '溝通':9, '創新':5, '執行力':7, '學習':6},
'王五': {'技術':9, '溝通':5, '創新':8, '執行力':6, '學習':9}
}
# 轉換為適合雷達圖的數據格式
categories = list(employees['張三'].keys())
values = {name: list(emp.values()) for name, emp in employees.items()}
# 繪制代碼...
products = {
'iPhone 15': {'性能':9, '相機':9, '續航':7, '屏幕':9, '生態':9, '價格':5},
'Galaxy S23': {'性能':8, '相機':8, '續航':8, '屏幕':9, '生態':7, '價格':6},
'Pixel 8': {'性能':7, '相機':9, '續航':6, '屏幕':8, '生態':6, '價格':7}
}
# 分析代碼...
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 10))
scaled_values = scaler.fit_transform(np.array(values).reshape(-1,1))
# 調整標簽位置
for label, angle in zip(ax.get_xticklabels(), angles):
if angle in [0, np.pi]:
label.set_horizontalalignment('center')
elif 0 < angle < np.pi:
label.set_horizontalalignment('left')
else:
label.set_horizontalalignment('right')
通過本文的詳細講解,相信您已經掌握了使用Matplotlib繪制雷達圖進行多維度對比分析的完整方法。在實際應用中,建議根據具體場景選擇合適的可視化方案,并不斷優化圖表以提高信息傳達效率。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。