版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第用python繪制極坐標(biāo)雷達(dá)圖目錄綜述繪圖代碼和解析繪制一張多主體雷達(dá)圖繪制多張單主體雷達(dá)圖總結(jié)
綜述
python的matplotlib畫圖庫的功能非常強(qiáng)大,可以畫很多很多種圖,我們?nèi)粘I钪杏龅降睦走_(dá)圖也不例外。
雷達(dá)圖也被稱為網(wǎng)絡(luò)圖,蜘蛛圖,星圖等,是一個(gè)不規(guī)則的多邊形。雷達(dá)圖可以形象地展示相同事物的多維指標(biāo),應(yīng)用場景非常多,比如本篇博客中,用來展示球員的不同能力的區(qū)別。
matplotlib庫中的雷達(dá)圖繪制是基于極坐標(biāo)的,因此所有的數(shù)據(jù)和標(biāo)簽都要根據(jù)角度來計(jì)算出位置。
本篇博客將詳細(xì)的解釋繪制雷達(dá)圖過程中的思路、過程以及各個(gè)函數(shù)方法的詳細(xì)解析,如有不正確的地方歡迎大佬指正~
繪圖代碼和解析
繪制一張多主體雷達(dá)圖
所謂多主體雷達(dá)圖,就是在一張圖中顯示多個(gè)多邊形組成的屬性圖,形成直觀的對比。
預(yù)處理
對應(yīng)的包下好,然后解決一下中文和符號顯示的問題,設(shè)置默認(rèn)的字體,修改繪圖樣式;
加載數(shù)據(jù)集(我這里的數(shù)據(jù)集來源:某綠色足球app),提取字典中的鍵和值分別保存在labels和score當(dāng)中。
importnumpyasnp
importmatplotlib.pyplotasplt
plt.rcParams['font.sans-serif']=['KaiTi']#指定默認(rèn)字體
plt.rcParams['axes.unicode_minus']=False#解決保存圖像是負(fù)號'-'顯示為方塊的問題
plt.style.use('ggplot')#設(shè)置ggplot主題樣式
#原始數(shù)據(jù)集并獲取數(shù)據(jù)集長度
results=[{"速度":68,"射門":91,"傳球":83,"盤帶":83,"防守":47,"力量":82},
{"速度":88,"射門":87,"傳球":82,"盤帶":86,"防守":42,"力量":69},
{"速度":58,"射門":55,"傳球":70,"盤帶":67,"防守":86,"力量":77}]
data_length=len(results[0])
#將極坐標(biāo)根據(jù)數(shù)據(jù)長度進(jìn)行等分,形成角度列表
angles=np.linspace(0,2*np.pi,data_length,endpoint=False)
#分離屬性字段和數(shù)據(jù)
labels=[keyforkeyinresults[0].keys()]
score=[[vforvinresult.values()]forresultinresults]
封閉雷達(dá)圖
由于我們畫出來的圖是一個(gè)封閉的多邊形,而我們提取出來的score、labels和angles數(shù)據(jù)的每一項(xiàng)并不是首尾相接的,因此我們需要把每一個(gè)列表的第一項(xiàng)copy一下,然后添加到列表末尾。
angles=np.concatenate((angles,[angles[0]]))
labels=np.concatenate((labels,[labels[0]]))
score_Harry=np.concatenate((score[0],[score[0][0]]))
score_Son=np.concatenate((score[1],[score[1][0]]))
score_Tobi=np.concatenate((score[2],[score[2][0]]))
這里因?yàn)槲遗巳齻€(gè)球員的數(shù)據(jù),所以有三條score數(shù)據(jù)。
提一下np.concatenate函數(shù),這是一個(gè)numpy庫中對多個(gè)數(shù)組進(jìn)行合并的函數(shù),參數(shù)格式為:concatenate((arr1,arr2,arr3),axis=0),第一個(gè)括號里面是要合并的數(shù)組,可以填任意個(gè),第二個(gè)axis參數(shù),與合并方式有關(guān),這里我們用不到就不多贅述了。
繪制圖像
繪制圖像基本跟繪制條形圖的步驟差不多,有幾個(gè)可以注意的點(diǎn):
plot函數(shù)中,繪制條形圖是按照橫坐標(biāo)-縱坐標(biāo)來填寫第一和第二個(gè)參數(shù)的,由于我們雷達(dá)圖是基于極坐標(biāo)的,matplotlib也很智能的提供了角度-半徑的極坐標(biāo)參數(shù)填寫方式;
plot中的顏色只管邊框顏色,fill函數(shù)中的顏色是填充顏色,可以自由組合追求美觀;
fill函數(shù)中的alpha參數(shù)指的是覆蓋區(qū)的透明度,越小表示越透明,區(qū)間0-1;
plt.legend圖例函數(shù)中的loc,是描述圖例位置的
代碼如下:
#設(shè)置圖形的大小
fig=plt.figure(figsize=(8,6),dpi=100)
#新建一個(gè)子圖
ax=plt.subplot(111,polar=True)
#繪制雷達(dá)圖并填充顏色
ax.plot(angles,score_Harry,color='orange')
ax.fill(angles,score_Harry,'y',alpha=0.4)
ax.plot(angles,score_Son,color='b')
ax.fill(angles,score_Son,'cyan',alpha=0.4)
ax.plot(angles,score_Tobi,color='r')
ax.fill(angles,score_Tobi,'salmon',alpha=0.4)
#設(shè)置雷達(dá)圖中每一項(xiàng)的標(biāo)簽顯示
ax.set_thetagrids(angles*180/np.pi,labels,fontsize=15)
ax.set_theta_zero_location('E')#設(shè)置0度坐標(biāo)軸起始位置,東西南北
ax.set_rlim(0,100)#設(shè)置雷達(dá)圖的坐標(biāo)刻度范圍
ax.set_rlabel_position(270)#設(shè)置雷達(dá)圖的坐標(biāo)值顯示角度,相對于起始角度的偏移量
ax.set_title("熱刺球員能力對比圖")
plt.legend(["哈里·凱恩","孫興愍","托比"],loc='lowerleft')
plt.show()
完整代碼:
importnumpyasnp
importmatplotlib.pyplotasplt
#解決中文顯示問題
plt.rcParams['font.sans-serif']=['KaiTi']#指定默認(rèn)字體
plt.rcParams['axes.unicode_minus']=False#解決保存圖像是負(fù)號'-'顯示為方塊的問題
plt.style.use('ggplot')#設(shè)置ggplot樣式
#原始數(shù)據(jù)集并獲取數(shù)據(jù)集長度
results=[{"速度":68,"射門":91,"傳球":83,"盤帶":83,"防守":47,"力量":82},
{"速度":88,"射門":87,"傳球":82,"盤帶":86,"防守":42,"力量":69},
{"速度":58,"射門":55,"傳球":70,"盤帶":67,"防守":86,"力量":77}]
data_length=len(results[0])
angles=np.linspace(0,2*np.pi,data_length,endpoint=False)#將極坐標(biāo)根據(jù)數(shù)據(jù)長度進(jìn)行等分
#分離屬性字段和數(shù)據(jù)
labels=[keyforkeyinresults[0].keys()]
score=[[vforvinresult.values()]forresultinresults]
#使雷達(dá)圖數(shù)據(jù)封閉
angles=np.concatenate((angles,[angles[0]]))
labels=np.concatenate((labels,[labels[0]]))
score_Harry=np.concatenate((score[0],[score[0][0]]))
score_Son=np.concatenate((score[1],[score[1][0]]))
score_Tobi=np.concatenate((score[2],[score[2][0]]))
#設(shè)置圖形的大小
fig=plt.figure(figsize=(8,6),dpi=100)
#新建一個(gè)子圖
ax=plt.subplot(111,polar=True)
#繪制雷達(dá)圖并填充顏色
ax.plot(angles,score_Harry,color='orange')
ax.fill(angles,score_Harry,'y',alpha=0.4)
ax.plot(angles,score_Son,color='b')
ax.fill(angles,score_Son,'cyan',alpha=0.4)
ax.plot(angles,score_Tobi,color='r')
ax.fill(angles,score_Tobi,'salmon',alpha=0.4)
#設(shè)置雷達(dá)圖中每一項(xiàng)的標(biāo)簽顯示
ax.set_thetagrids(angles*180/np.pi,labels,fontsize=15)
ax.set_theta_zero_location('E')#設(shè)置0度坐標(biāo)軸起始位置,東西南北
ax.set_rlim(0,100)#設(shè)置雷達(dá)圖的坐標(biāo)刻度范圍
ax.set_rlabel_position(270)#設(shè)置雷達(dá)圖的坐標(biāo)值顯示角度,相對于起始角度的偏移量
ax.set_title("熱刺球員能力對比圖")
plt.legend(["哈里·凱恩","孫興愍","托比"],loc='lowerleft')
plt.show()
最后得到的雷達(dá)圖:
還是挺好看的()
繪制多張單主體雷達(dá)圖
數(shù)據(jù)處理部分跟上面一樣,我們直接從畫圖講起。
建立子圖
首先我們用plt.figure繪制好基本畫布之后,需要建立三個(gè)子圖(因?yàn)橛腥齻€(gè)球員):
ax1=plt.subplot(131,polar=True)
ax2=plt.subplot(132,polar=True)
ax3=plt.subplot(133,polar=True)
我們把整個(gè)畫布看作一個(gè)矩陣,有m行n列;
第一個(gè)參數(shù)是一個(gè)三位數(shù),第一位表示該子圖在整個(gè)畫布的行位置,1表示總共把畫布劃分為1行;第二位表示列,3表示總共把畫布劃分為3列;第三個(gè)表示索引值,指的是具體的位置,按照從上到下從左到右排列,比如在一個(gè)2*2的畫布中,索引值為3表示在第二行第一個(gè);
循環(huán)遍歷畫每個(gè)子圖
首先把畫圖用的子圖、數(shù)據(jù)、標(biāo)簽、顏色都用列表存起來,方便遍歷;
遍歷每一個(gè)子圖:
首先畫角度坐標(biāo)軸和框線,-.表示框線的樣式是有一個(gè)小線段加一個(gè)點(diǎn)組成,lw是linewidth的縮寫,表示線的粗細(xì);
先繪制沿半徑方向的等值線,再繪制角度軸;
繪圖并填充顏色,跟上面一樣;
標(biāo)出數(shù)據(jù)下標(biāo),ha和va是調(diào)整水平和垂直方向的位置
最后調(diào)整labels、坐標(biāo)值范圍等參數(shù)
ax,data,name,color=[ax1,ax2,ax3],[score_Harry,score_Son,score_Tobi],["哈里·凱恩","孫興愍","托比"],["orange","cyan","green"]
foriinrange(3):
#繪制角度軸和框線
forjinnp.arange(0,100+20,20):
ax[i].plot(angles,7*[j],'-.',lw=0.5,color='black')#沿半徑方向的等值線
forjinrange(5):
ax[i].plot([angles[j],angles[j]],[0,100],'-.',lw=0.5,color='black')#繪制角度軸
#繪制圖像并填充顏色
ax[i].plot(angles,data[i],color=color[i])
ax[i].fill(angles,data[i],color=color[i],alpha=0.4)
#數(shù)據(jù)下標(biāo)
fora,binzip(angles,data[i]):
ax[i].text(a,b+5,'%.00f'%b,ha='center',va='center',fontsize=1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026江西省歐潭人力資源集團(tuán)有限公司招聘見習(xí)生3人筆試參考題庫及答案解析
- 2026上半年貴州事業(yè)單位聯(lián)考赫章縣招聘153人筆試備考試題及答案解析
- 2026年工程地質(zhì)勘察中的質(zhì)量保證措施
- 2026年土地利用中的地質(zhì)災(zāi)害防范策略
- 2025年少先隊(duì)提前入隊(duì)筆試題及答案
- 2025年廣東廣業(yè)投資集團(tuán)筆試及答案
- 2026新興際華集團(tuán)所屬中新聯(lián)公司招聘事業(yè)部總經(jīng)理副總經(jīng)理筆試模擬試題及答案解析
- 2025年材料類事業(yè)單位考試真題及答案
- 2026年臨界含水率對土壤材料的影響
- 2026四川能投綜合能源有限責(zé)任公司員工招聘19人筆試備考試題及答案解析
- 2026年及未來5年中國TFT液晶面板行業(yè)市場發(fā)展數(shù)據(jù)監(jiān)測及投資方向研究報(bào)告
- 大唐集團(tuán)機(jī)考行測題庫
- 車輛日常安全檢查課件
- 民航安全法律法規(guī)課件
- 山東省濟(jì)寧市2026屆第一學(xué)期高三質(zhì)量檢測期末考試濟(jì)寧一模英語(含答案)
- 光伏電站巡檢培訓(xùn)課件
- 中建建筑電氣系統(tǒng)調(diào)試指導(dǎo)手冊
- 年末節(jié)前安全教育培訓(xùn)
- 安全生產(chǎn)麻痹思想僥幸心理
- GB/T 93-2025緊固件彈簧墊圈標(biāo)準(zhǔn)型
- 建設(shè)工程測繪驗(yàn)線標(biāo)準(zhǔn)報(bào)告模板
評論
0/150
提交評論