您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python中如何使用matplotlib制作雷達圖進行對比分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
前言
雷達圖的背景一圈一圈地像雷達,用多邊形來展現數據的大小,我認為比較適合用于有多種不同維度的情形,是發現差距的一種好工具。
其中「持續性」與學習的天數相關,「學習量」與聽課或看書的數量相關,「筆記」與筆記的數量和互動相關,「知識分享」與分享轉發的次數相關,「好奇心」與搜索的次數和廣度相關。
從圖中可以看出,在 2020 年的年初,我在筆記方面還比較薄弱,經過努力,我做筆記的數量明顯增加了。
借助雷達圖,我們可以直觀地看到差距,進而通過分析,更好地進行改善。
接下來,我們看看用 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()
雷達在展現多個維度的得分或性能方面,效果不錯,在財務分析和標桿管理中有著廣泛的應用。
另外,在一些游戲中,也有用雷達圖來展現人物的能力。
但是,雷達圖也有一些自身的缺點,包括:
(1)如果在一個雷達圖中展現超過 2 組數據,會讓圖表難以閱讀。
(2)變量的個數不宜過多,否則密密麻麻的線條可能讓人抓不到重點。
(3)從表達數據的精確度來看,極坐標中的角度,不如直角坐標中的位置。
同樣的數據,不同人得出的觀點可能不一樣,圖表的選擇可能也不一樣,我們通常需要考慮以下幾個因素:
(1)分析提煉的信息;
(2)所屬數據的類型;
(3)想要表達的觀點;
(4)想要強調的信息。
很多人作圖有一種誤區,就是喜歡運用所謂的技巧和創新,做出讓人難以看懂的復雜圖表,這與圖表的目的背道而馳,是我們應該避免的。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python中如何使用matplotlib制作雷達圖進行對比分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。