Python繪製雷達圖



本篇文章介紹使用matplotlib繪製雷達圖。python

雷達圖也被稱爲網絡圖,蜘蛛圖,星圖,蜘蛛網圖,是一個不規則的多邊形。雷達圖能夠形象地展現相同事物的多維指標,應用場景很是多。數組

1、matplotlib繪製圓形雷達圖

# coding=utf-8 import numpy as np import matplotlib.pyplot as plt results = [{"大學英語": 87, "高等數學": 79, "體育": 95, "計算機基礎": 92, "程序設計": 85}, {"大學英語": 80, "高等數學": 90, "體育": 91, "計算機基礎": 85, "程序設計": 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=(8, 6), dpi=100) # 新建一個子圖 ax = plt.subplot(111, polar=True) # 繪製雷達圖 ax.plot(angles, score_a, color='g') ax.plot(angles, score_b, color='b') # 設置雷達圖中每一項的標籤顯示 ax.set_thetagrids(angles*180/np.pi, labels) # 設置雷達圖的0度起始位置 ax.set_theta_zero_location('N') # 設置雷達圖的座標刻度範圍 ax.set_rlim(0, 100) # 設置雷達圖的座標值顯示角度,相對於起始角度的偏移量 ax.set_rlabel_position(270) ax.set_title("計算機專業大一(上)") plt.legend(["弓長張", "口天吳"], loc='best') plt.show() 

運行結果:網絡

 

 

繪製雷達圖須要先創建極座標系,關於極座標系能夠本身瞭解一下。創建好極座標系後能夠在極座標系中繪製折線圖、柱狀圖等,大部分狀況,都是用折線圖,造成一個不規則的閉合多邊形。本文中用某高校大一的期末考試成績做爲例子來演示雷達圖的效果。函數

linspace(): 用於將極座標系根據數據的維度進行等分,linspace()函數的第一個參數傳入起始角度,第二參數傳入結束角度,第三個參數傳入分紅多少等份。其餘參數根據須要傳入,如endpoint默認爲True,最後一個數據處於結束的角度,根據本例中前面的參數0~2π,應該設置爲False,不然最後一個數據與第一個數據角度重疊了。spa

concatenate(): 使雷達圖的數據是環形封閉的,concatenate()函數的第一個參數是一個元組,元組中的每一個元素是一個數組,concatenate()函數將這些數組鏈接到一塊兒,組成一個新的數組。要讓繪製的雷達圖封閉,將數據的第一個值鏈接到數組的結尾便可。設計

本文用折線圖plot()來繪製雷達圖,使用figure()函數設置好圖形的大小和清晰度,而後使用subplot()函數來建立一張子圖。subplot()函數的第一個參數傳入長度爲3的數字,第一個數字表示將畫布分紅幾行,第二個數字表示將畫布分紅幾列,第三個數字表示當前的子圖處於哪一個位置(按從左至右、從上到下的順序排序),第三個數字不能超出前兩個數字切分的子圖數範圍。如111表示將畫布分紅一行一列(只有一張子圖),當前的子圖處於第一張子圖中。在subplot()函數中,將polar參數設置成True,獲得的圖形纔是極座標。code

極座標系設置完成後,使用子圖對象ax調用折線圖函數plot(),便可繪出雷達圖。若是有多組數據,屢次調用plot()函數便可。對象

使用set_thetagrids()方法設置雷達圖中每一個維度的標籤和顯示位置。使用set_theta_zero_location()方法設置雷達圖的0度位置,能夠傳入"N"、"NW"、"W"、"SW"、"S"、"SE"、"E"、"NE"八個方位縮寫。使用set_rlim()方法設置極座標上的刻度範圍。使用set_rlabel_position()方法設置極座標上的刻度標籤顯示位置,傳入一個相對於雷達圖0度的角度值。固然還能夠根據須要設置其餘屬性,如標題、圖例等。blog

在上面的例子中,將兩位同窗的考試成績繪製成了雷達圖,經過雷達圖,能夠看出兩我的的單科成績互有高低,而總體來看,兩位同窗的成績都很優秀。上面的雷達圖中,網格線都是圓形的,而用折線圖鏈接的雷達圖兩個維度之間是直線鏈接的,因此將網格線換成多邊形會更合理一點。排序

2、matplotlib繪製多邊形雷達圖

import numpy as np import matplotlib.pyplot as plt results = [{"大學英語": 87, "高等數學": 79, "體育": 95, "計算機基礎": 92, "程序設計": 85}, {"大學英語": 80, "高等數學": 90, "體育": 91, "計算機基礎": 85, "程序設計": 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("計算機專業大一(上)") ax1 = plt.subplot(121, polar=True) ax2 = plt.subplot(122, polar=True) ax, data, name = [ax1, ax2], [score_a, score_b], ["弓長張", "口天吳"] 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) # 隱藏圓形網格線 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() 

運行結果:

 

 

在極座標系中,極徑值相等的點在一個圓上,因此繪製的雷達圖中,網格線默認都是圓形的。若是要繪製多邊形的雷達圖,則須要將圓形的網格線隱藏,而後根據刻度範圍繪製出多邊形的網格線。

首先使用plot()函數,根據刻度範圍,繪製出同心的多個多邊形和多個維度方向的極軸,做爲雷達圖的網格線,造成一張「網」。

鏈式調用極座標的spines['polar'].set_visible()方法,傳入參數False,將極座標系最外圈的圓形隱藏。調用grid()方法,傳入參數False,將極座標系中的的圓形網格線隱藏。

修改完網格線後,便可達到多邊形的效果。在第二次繪製雷達圖時,將兩位同窗的成績分到兩張不一樣的雷達圖中,並用text()方法設置了每一個維度的數據標註,使用fig對象的suptitle()方法來設置整張圖形的標題。

上面的兩次繪圖,將兩位同窗的成績繪製在同一張雷達圖時,更方便對比兩位同窗的成績,如比較誰更全面、更優秀。分開繪製時,更方便分析我的的成績狀況,如是否偏科。而相對於圓形的雷達圖,在多邊形的雷達圖中,不會出現雷達圖與網格線的不合理交叉(雷達圖與網格線交叉兩次),使用多邊形網格線更合理。

相關文章
相關標籤/搜索