數(shù)據(jù)可視化:用雷達圖進行對比分析

導讀:雷達圖的背景一圈一圈像雷達,用多邊形來展現(xiàn)數(shù)據(jù)的大小,我認為比較適合用于有多種不同維度的情形,是發(fā)現(xiàn)差距的一種好工具。
作者 / 來源:林驥(ID:linjiwx)
01
比如說,「得到 APP」上的學分構(gòu)成包括 5 個不同維度,我根據(jù)自己的學分構(gòu)成及其變化,制作了一張雷達圖。

其中「持續(xù)性」與學習的天數(shù)相關,「學習量」與聽課或看書的數(shù)量相關,「筆記」與筆記的數(shù)量和互動相關,「知識分享」與分享轉(zhuǎn)發(fā)的次數(shù)相關,「好奇心」與搜索的次數(shù)和廣度相關。
從圖中可以看出,在 2020 年的年初,我在筆記方面還比較薄弱,經(jīng)過努力,我做筆記的數(shù)量明顯增加了。
借助雷達圖,我們可以直觀地看到差距,進而通過分析,更好地進行改善。
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
#?禁用科學計數(shù)法
pd.set_option('display.float_format',?lambda?x:?'%.2f'?%?x)?
#?定義顏色,主色:藍色,輔助色:灰色,互補色:橙色
c?=?{'藍色':'#00589F',?'深藍色':'#003867',?'淺藍色':'#5D9BCF',
?????'灰色':'#999999',?'深灰色':'#666666',?'淺灰色':'#CCCCCC',
?????'橙色':'#F68F00',?'深橙色':'#A05D00',?'淺橙色':'#FBC171'}其次,從 Excel 文件中讀取數(shù)據(jù),并定義畫圖用的數(shù)據(jù)。
#?數(shù)據(jù)源路徑
filepath='./data/林驥的學分構(gòu)成.xlsx'
#?讀取?Excel文件
df?=?pd.read_excel(filepath)
#?提取畫圖所需的數(shù)據(jù)
data0?=?df.iloc[0,?2:].values
data1?=?df.iloc[1,?2:].values
#提取標簽
label?=?np.array(df.iloc[1,?2:].index)
#?根據(jù)分數(shù)添加評級的標簽
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?有幾個數(shù)據(jù),就把整圓?360°?分成幾份
angle?=?np.linspace(0,?2*np.pi,?len(data0),?endpoint=False)
#?增加第一個?angle?到所有?angle?里,以實現(xiàn)閉合
angles?=?np.concatenate((angle,?[angle[0]]))
#?倒轉(zhuǎn)順序,以讓雷達圖順時針顯示
angles?=?angles[::-1]
#增加第一個?data?到所有的?data?里,以實現(xiàn)閉合
data0?=?np.concatenate((data0,?[data0[0]]))
data1?=?np.concatenate((data1,?[data1[0]]))接下來,開始用「面向?qū)ο蟆沟姆椒ㄟM行畫圖。
#?使用「面向?qū)ο蟆沟姆椒ó媹D,定義圖片的大小
fig,?ax=plt.subplots(figsize=(8,?8),?subplot_kw=dict(polar=True))
#?設置背景顏色
fig.set_facecolor('w')
ax.set_facecolor('w')
#?設置標題
ax.set_title('\n林驥的學分構(gòu)成及其變化\n\n',?fontsize=26,?loc='left',?color=c['深灰色'])?
#?設置網(wǎng)格標簽
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()
下載畫圖用的數(shù)據(jù)和完整代碼,你可以前往:https://github.com/linjiwx/mp
03
雷達在展現(xiàn)多個維度的得分或性能方面,效果不錯,在財務分析和標桿管理中有著廣泛的應用。
另外,在一些游戲中,也有用雷達圖來展現(xiàn)人物的能力。
但是,雷達圖也有一些自身的缺點,包括:
- 如果在一個雷達圖中展現(xiàn)超過 2 組數(shù)據(jù),會讓圖表難以閱讀。
- 變量的個數(shù)不宜過多,否則密密麻麻的線條可能讓人抓不到重點。
- 從表達數(shù)據(jù)的精確度來看,極坐標中的角度,不如直角坐標中的位置。
同樣的數(shù)據(jù),不同人得出的觀點可能不一樣,圖表的選擇可能也不一樣,我們通常需要考慮以下幾個因素:
- 分析提煉的信息;
- 所屬數(shù)據(jù)的類型;
- 想要表達的觀點;
- 想要強調(diào)的信息。
很多人作圖有一種誤區(qū),就是喜歡運用所謂的技巧和創(chuàng)新,做出讓人難以看懂的復雜圖表,這與圖表的目的背道而馳,是我們應該避免的。

劃重點?
干貨直達?
更多精彩?
在公眾號對話框輸入以下關鍵詞查看更多優(yōu)質(zhì)內(nèi)容!
PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白大數(shù)據(jù)?|?云計算?|?數(shù)據(jù)庫?|?Python?|?可視化?|?神操作AI?|?人工智能?|?機器學習?|?深度學習?|?神經(jīng)網(wǎng)絡5G?|?中臺?|?用戶畫像?|?1024?|?大神?|?數(shù)學?|?揭秘
據(jù)統(tǒng)計,99%的大咖都完成了這個神操作?

評論
圖片
表情
