如何利用Python matplotlib繪制雷達(dá)圖
本篇文章介紹使用matplotlib繪制雷達(dá)圖。
雷達(dá)圖也被稱(chēng)為網(wǎng)絡(luò)圖,蜘蛛圖,星圖,蜘蛛網(wǎng)圖,是一個(gè)不規(guī)則的多邊形。雷達(dá)圖可以形象地展示相同事物的多維指標(biāo),雷達(dá)圖幾乎隨處可見(jiàn),應(yīng)用場(chǎng)景非常多。
一、matplotlib繪制圓形雷達(dá)圖
# coding=utf-8 import numpy as np import matplotlib.pyplot as plt results = [{"大學(xué)英語(yǔ)": 87, "高等數(shù)學(xué)": 79, "體育": 95, "計(jì)算機(jī)基礎(chǔ)": 92, "程序設(shè)計(jì)": 85}, {"大學(xué)英語(yǔ)": 80, "高等數(shù)學(xué)": 90, "體育": 91, "計(jì)算機(jī)基礎(chǔ)": 85, "程序設(shè)計(jì)": 88}] data_length = len(results[0]) # 將極坐標(biāo)根據(jù)數(shù)據(jù)長(zhǎng)度進(jìn)行等分 angles = np.linspace(0, 2*np.pi, data_length, endpoint=False) labels = [key for key in results[0].keys()] score = [[v for v in result.values()] for result in results] # 使雷達(dá)圖數(shù)據(jù)封閉 score_a = np.concatenate((score[0], [score[0][0]])) score_b = np.concatenate((score[1], [score[1][0]])) angles = np.concatenate((angles, [angles[0]])) labels = np.concatenate((labels, [labels[0]])) # 設(shè)置圖形的大小 fig = plt.figure(figsize=(8, 6), dpi=100) # 新建一個(gè)子圖 ax = plt.subplot(111, polar=True) # 繪制雷達(dá)圖 ax.plot(angles, score_a, color='g') ax.plot(angles, score_b, color='b') # 設(shè)置雷達(dá)圖中每一項(xiàng)的標(biāo)簽顯示 ax.set_thetagrids(angles*180/np.pi, labels) # 設(shè)置雷達(dá)圖的0度起始位置 ax.set_theta_zero_location('N') # 設(shè)置雷達(dá)圖的坐標(biāo)刻度范圍 ax.set_rlim(0, 100) # 設(shè)置雷達(dá)圖的坐標(biāo)值顯示角度,相對(duì)于起始角度的偏移量 ax.set_rlabel_position(270) ax.set_title("計(jì)算機(jī)專(zhuān)業(yè)大一(上)") plt.legend(["弓長(zhǎng)張", "口天吳"], loc='best') plt.show()
運(yùn)行結(jié)果:
繪制雷達(dá)圖需要先建立極坐標(biāo)系,關(guān)于極坐標(biāo)系可以自己了解一下。建立好極坐標(biāo)后可以在極坐標(biāo)中繪制折線(xiàn)圖、柱狀圖等,大部分情況,都是用折線(xiàn)圖,形成一個(gè)不規(guī)則的閉合多邊形。本文中用某高校大一的期末考試成績(jī)作為例子來(lái)演示雷達(dá)圖的效果。
linspace(): 用于將極坐標(biāo)根據(jù)數(shù)據(jù)的維度進(jìn)行等分,第一個(gè)參數(shù)傳入起始角度,第二參數(shù)傳入結(jié)束角度,第三個(gè)參數(shù)傳入分成多少等份。其他參數(shù)根據(jù)需要傳入,如endpoint默認(rèn)為T(mén)rue,最后一個(gè)數(shù)據(jù)處于結(jié)束的角度,根據(jù)本例中前面的參數(shù)0~2π,應(yīng)該設(shè)置為False,否則最后一個(gè)數(shù)據(jù)與第一個(gè)數(shù)據(jù)角度重疊了。
concatenate(): 使雷達(dá)圖的數(shù)據(jù)是環(huán)形封閉的,concatenate()函數(shù)的第一個(gè)參數(shù)是一個(gè)元組,元組中的每個(gè)元素是一個(gè)數(shù)組,concatenate()函數(shù)將這些數(shù)組連接到一起,組成一個(gè)新的數(shù)組。要讓繪制的雷達(dá)圖封閉,將數(shù)據(jù)的第一個(gè)值連接到數(shù)據(jù)的結(jié)尾即可。
本文用折線(xiàn)圖plot()來(lái)繪制雷達(dá)圖,使用figure()函數(shù)設(shè)置好圖形的大小和清晰度,然后使用subplot()函數(shù)來(lái)創(chuàng)建一張子圖。subplot()函數(shù)的第一個(gè)參數(shù)傳入長(zhǎng)度為3的數(shù)字,第一個(gè)數(shù)字表示將畫(huà)布分成幾行,第二個(gè)數(shù)字表示將畫(huà)布分成幾列,第三個(gè)數(shù)字表示當(dāng)前的子圖處于哪個(gè)位置(按從左至右、從上到下的順序排序),第三個(gè)數(shù)字不能超出前兩個(gè)數(shù)字切分的子圖數(shù)范圍。如111表示將畫(huà)布分成一行一列(只有一張子圖),當(dāng)前的子圖處于第一張子圖中。在subplot()函數(shù)中,將polar參數(shù)設(shè)置True,得到的圖形才是極坐標(biāo)。
極坐標(biāo)系設(shè)置完成后,使用子圖對(duì)象ax調(diào)用折線(xiàn)圖函數(shù)plot(),即可繪出雷達(dá)圖。如果有多組數(shù)據(jù),多次調(diào)用plot()函數(shù)即可。
使用set_thetagrids()函數(shù)設(shè)置雷達(dá)圖中每個(gè)維度的標(biāo)簽和顯示位置。使用set_theta_zero_location()函數(shù)設(shè)置雷達(dá)圖的0度位置,可以傳入"N"、"NW"、"W"、"SW"、"S"、"SE"、"E"、"NE"八個(gè)方位縮寫(xiě)。使用set_rlim()函數(shù)設(shè)置極坐標(biāo)上的刻度范圍。使用set_rlabel_position()函數(shù)設(shè)置極坐標(biāo)上的刻度標(biāo)簽顯示位置,傳入一個(gè)相對(duì)于雷達(dá)圖0度的角度值。當(dāng)然還可以根據(jù)需要設(shè)置其他屬性,如標(biāo)題、圖例等。
在上面的例子中,將兩位同學(xué)的考試成績(jī)繪制成了雷達(dá)圖,通過(guò)雷達(dá)圖,可以看出兩個(gè)人的單科成績(jī)互有高低,而整體來(lái)看,兩位同學(xué)成績(jī)都很優(yōu)秀。上面的雷達(dá)圖中,網(wǎng)格線(xiàn)都是圓形的,而用折線(xiàn)圖連接的雷達(dá)圖兩個(gè)維度之間是直接連接的,所以將網(wǎng)格線(xiàn)換成多邊形會(huì)更合理一點(diǎn)。
二、matplotlib繪制多邊形雷達(dá)圖
import numpy as np import matplotlib.pyplot as plt results = [{"大學(xué)英語(yǔ)": 87, "高等數(shù)學(xué)": 79, "體育": 95, "計(jì)算機(jī)基礎(chǔ)": 92, "程序設(shè)計(jì)": 85}, {"大學(xué)英語(yǔ)": 80, "高等數(shù)學(xué)": 90, "體育": 91, "計(jì)算機(jī)基礎(chǔ)": 85, "程序設(shè)計(jì)": 88}] data_length = len(results[0]) angles = np.linspace(0, 2*np.pi, data_length, endpoint=False) labels = [key for key in results[0].keys()] score = [[v for v in result.values()] for result in results] score_a = np.concatenate((score[0], [score[0][0]])) score_b = np.concatenate((score[1], [score[1][0]])) angles = np.concatenate((angles, [angles[0]])) labels = np.concatenate((labels, [labels[0]])) fig = plt.figure(figsize=(10, 6), dpi=100) fig.suptitle("計(jì)算機(jī)專(zhuān)業(yè)大一(上)") ax1 = plt.subplot(121, polar=True) ax2 = plt.subplot(122, polar=True) ax, data, name = [ax1, ax2], [score_a, score_b], ["弓長(zhǎng)張", "口天吳"] for i in range(2): for j in np.arange(0, 100+20, 20): ax[i].plot(angles, 6*[j], '-.', lw=0.5, color='black') for j in range(5): ax[i].plot([angles[j], angles[j]], [0, 100], '-.', lw=0.5, color='black') ax[i].plot(angles, data[i], color='b') # 隱藏最外圈的圓 ax[i].spines['polar'].set_visible(False) # 隱藏圓形網(wǎng)格線(xiàn) ax[i].grid(False) for a, b in zip(angles, data[i]): ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=12, color='b') ax[i].set_thetagrids(angles*180/np.pi, labels) ax[i].set_theta_zero_location('N') ax[i].set_rlim(0, 100) ax[i].set_rlabel_position(0) ax[i].set_title(name[i]) plt.show()
運(yùn)行結(jié)果:
在極坐標(biāo)系中,極徑值相等的點(diǎn)在一個(gè)圓上,所以繪制的雷達(dá)圖中,網(wǎng)格線(xiàn)默認(rèn)都是圓形的。如果要繪制多邊形的雷達(dá)圖,則需要將圓形的網(wǎng)格線(xiàn)隱藏,然后根據(jù)刻度范圍繪制出多邊形的網(wǎng)格線(xiàn)。
首先使用plot()函數(shù),根據(jù)刻度范圍,繪制出同心的多個(gè)多邊形和多個(gè)維度方向的極軸,作為雷達(dá)圖的網(wǎng)格線(xiàn),形成一張“網(wǎng)”。
鏈?zhǔn)秸{(diào)用極坐標(biāo)的spines['polar'].set_visible()函數(shù),傳入?yún)?shù)False,將極坐標(biāo)系最外圈的圓形隱藏。調(diào)用grid()函數(shù),傳入?yún)?shù)False,將極坐標(biāo)系中的的圓形網(wǎng)格線(xiàn)隱藏。
修改完網(wǎng)格線(xiàn)后,即可達(dá)到多邊形的效果。在第二次繪制雷達(dá)圖時(shí),將兩位同學(xué)的成績(jī)分到兩張不同的雷達(dá)圖中,并用text()設(shè)置了每個(gè)維度的數(shù)據(jù)標(biāo)注,使用suptitle()函數(shù)來(lái)設(shè)置整張圖形的標(biāo)題。
上面的兩次繪圖,將兩位同學(xué)的成績(jī)繪制在同一張雷達(dá)圖時(shí),更方便對(duì)比兩位同學(xué)的成績(jī),如比較誰(shuí)更全面、更優(yōu)秀。分開(kāi)繪制時(shí),更方便分析個(gè)人的成績(jī)情況,如是否偏科。而相對(duì)于圓形的雷達(dá)圖,在多邊形的雷達(dá)圖中,不會(huì)出現(xiàn)雷達(dá)圖與網(wǎng)格線(xiàn)的不合理交叉(雷達(dá)圖與網(wǎng)格線(xiàn)交叉兩次),使用多邊形網(wǎng)格線(xiàn)更合理。
到此這篇關(guān)于如何利用Python matplotlib繪制雷達(dá)圖的文章就介紹到這了,更多相關(guān)Python matplotlib繪制雷達(dá)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用Redis計(jì)算經(jīng)緯度距離案例
這篇文章主要介紹了Python利用Redis計(jì)算經(jīng)緯度距離案例,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09使用 django orm 寫(xiě) exists 條件過(guò)濾實(shí)例
這篇文章主要介紹了使用 django orm 寫(xiě) exists 條件過(guò)濾實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05利用Python繪制Jazz網(wǎng)絡(luò)圖的例子
今天小編就為大家分享一篇利用Python繪制Jazz網(wǎng)絡(luò)圖的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python多線(xiàn)程編程(三):threading.Thread類(lèi)的重要函數(shù)和方法
這篇文章主要介紹了Python多線(xiàn)程編程(三):threading.Thread類(lèi)的重要函數(shù)和方法,本文講解了線(xiàn)程名稱(chēng)、join方法、setDaemon方法等內(nèi)容,需要的朋友可以參考下2015-04-04Python記錄numpy.empty()函數(shù)引發(fā)的問(wèn)題及解決
這篇文章主要介紹了Python記錄numpy.empty()函數(shù)引發(fā)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03PyTorch的深度學(xué)習(xí)入門(mén)教程之構(gòu)建神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了PyTorch的深度學(xué)習(xí)入門(mén)教程之構(gòu)建神經(jīng)網(wǎng)絡(luò),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06使用python socket分發(fā)大文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇使用python socket分發(fā)大文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07