1. 程式人生 > 實用技巧 >Python視覺化:matplotlib 製作雷達圖進行對比分析

Python視覺化:matplotlib 製作雷達圖進行對比分析

前言

雷達圖的背景一圈一圈地像雷達,用多邊形來展現資料的大小,我認為比較適合用於有多種不同維度的情形,是發現差距的一種好工具。

比如說,「得到 APP」上的學分構成包括 5 個不同維度,我根據自己的學分構成及其變化,製作了一張雷達圖。

其中「持續性」與學習的天數相關,「學習量」與聽課或看書的數量相關,「筆記」與筆記的數量和互動相關,「知識分享」與分享轉發的次數相關,「好奇心」與搜尋的次數和廣度相關。

從圖中可以看出,在 2020 年的年初,我在筆記方面還比較薄弱,經過努力,我做筆記的數量明顯增加了。

藉助雷達圖,我們可以直觀地看到差距,進而通過分析,更好地進行改善。

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

02

接下來,我們看看用 matplotlib 畫圖的具體步驟。

首先,匯入所需的庫,並設定中文字型和定義顏色等。

# 匯入所需的庫
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常顯示中文標籤
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 自動適應佈局
mpl.rcParams.update({'
figure.autolayout': True}) # 正常顯示負號 mpl.rcParams['axes.unicode_minus'] = False # 禁用科學計數法 pd.set_option('display.float_format', lambda x: '%.2f' % x) # 定義顏色,主色:藍色,輔助色:灰色,互補色:橙色 c = {'藍色':'#00589F', '深藍色':'#003867', '淺藍色':'#5D9BCF', '灰色':'#999999', '深灰色':'#666666', '淺灰色':'#CCCCCC', '橙色':'#F68F00
', '深橙色':'#A05D00', '淺橙色':'#FBC171'}

其次,從 Excel 檔案中讀取資料,並定義畫圖用的資料。

# 資料來源路徑
filepath='./data/林驥的學分構成.xlsx'

# 讀取 Excel檔案
df = pd.read_excel(filepath)

# 提取畫圖所需的資料
data0 = df.iloc[0, 2:].values
data1 = df.iloc[1, 2:].values

#提取標籤
label = np.array(df.iloc[1, 2:].index)

# 根據分數新增評級的標籤
for i, d in enumerate(data1):
    if d > 4:
        grade = 'A^+'
    elif d == 4:
        grade = 'A'
    elif d > 3:
        grade = 'B^+'
    elif d == 3:
        grade = 'B'
    else:
        grade = 'B^-'
    label[i] += '\n' + r'$\bf{' + grade + '}$'
    

# data 有幾個資料,就把整圓 360° 分成幾份
angle = np.linspace(0, 2*np.pi, len(data0), endpoint=False)

# 增加第一個 angle 到所有 angle 裡,以實現閉合
angles = np.concatenate((angle, [angle[0]]))

# 倒轉順序,以讓雷達圖順時針顯示
angles = angles[::-1]

#增加第一個 data 到所有的 data 裡,以實現閉合
data0 = np.concatenate((data0, [data0[0]]))
data1 = np.concatenate((data1, [data1[0]]))

接下來,開始用「面向物件」的方法進行畫圖。

# 使用「面向物件」的方法畫圖,定義圖片的大小
fig, ax=plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))

# 設定背景顏色
fig.set_facecolor('w')
ax.set_facecolor('w')

# 設定標題
ax.set_title('\n林驥的學分構成及其變化\n\n', fontsize=26, loc='left', color=c['深灰色']) 

# 設定網格標籤
ax.set_thetagrids(angles*180/np.pi, labels=label)

# 畫雷達圖,用順時針顯示
ax.plot(angles, data0, 'o-', label=df.iloc[0, 0].strftime('%Y-%m-%d'))
ax.plot(angles, data1, 'o-', label=df.iloc[1, 0].strftime('%Y-%m-%d'))

# 設定極座標 0° 的位置
ax.set_theta_zero_location('N') 

# 設定顯示的極徑範圍
ax.set_rlim(0, 5)

# 填充顏色
ax.fill(angles, data0, facecolor=c['淺藍色'], alpha=0.6)
ax.fill(angles, data1, facecolor=c['淺橙色'], alpha=0.6)

# 設定極徑標籤,放在第一象限的中間位置
ax.set_rlabel_position(360-360/len(data0)/2)

# 設定圖例顯示的位置
l = ax.legend(ncol=2, loc='lower center', frameon=False, borderaxespad=-3, fontsize=13)
for text in l.get_texts():
    text.set_color(c['深灰色'])
#     text.set_size(13)

# 去掉最外圍的黑圈
ax.spines['polar'].set_visible(False) 

# 設定座標標籤字型大小和顏色
ax.tick_params(labelsize=16, colors=c['深灰色'])

plt.show()

03

雷達在展現多個維度的得分或效能方面,效果不錯,在財務分析和標杆管理中有著廣泛的應用。

另外,在一些遊戲中,也有用雷達圖來展現人物的能力。

但是,雷達圖也有一些自身的缺點,包括:

(1)如果在一個雷達圖中展現超過 2 組資料,會讓圖表難以閱讀。

(2)變數的個數不宜過多,否則密密麻麻的線條可能讓人抓不到重點。

(3)從表達資料的精確度來看,極座標中的角度,不如直角座標中的位置。

同樣的資料,不同人得出的觀點可能不一樣,圖表的選擇可能也不一樣,我們通常需要考慮以下幾個因素:

(1)分析提煉的資訊;

(2)所屬資料的型別;

(3)想要表達的觀點;

(4)想要強調的資訊。

很多人作圖有一種誤區,就是喜歡運用所謂的技巧和創新,做出讓人難以看懂的複雜圖表,這與圖表的目的背道而馳,是我們應該避免的。

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:林驥