【Python】繪製雷達圖

之前在一些數據分析案例中看到用 Go 語言繪製的雷達圖,非常的漂亮,就想着用matlibplot.pyplot也照着畫一個,遺憾的是matlibplot.pyplot模塊中沒有直接繪製雷達圖的函數,不過可以基於‘polar’圖形特徵來改進,下面就記錄一下如何繪製雷達圖。 

import numpy as np
import matplotlib.pyplot as plt
# 用於正常顯示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
#用於正常顯示符號
plt.rcParams['axes.unicode_minus'] = False
 
# 使用ggplot的繪圖風格,這個類似於美化了,可以通過plt.style.available查看可選值,你會發現其它的風格真的醜。。。
plt.style.use('ggplot')
 
# 構造數據
values = [2.6,2.1,3.4,3,4.1]
feature = ['個人能力','QC知識','解決問題能力','服務質量意識','團隊精神']
 
# 設置每個數據點的顯示位置,在雷達圖上用角度表示
angles=np.linspace(0, 2*np.pi,len(values), endpoint=False)
 
# 拼接數據首尾,使圖形中線條封閉
values=np.concatenate((values,[values[0]]))
angles=np.concatenate((angles,[angles[0]]))
 
# 繪圖
fig=plt.figure()
# 設置爲極座標格式
ax = fig.add_subplot(111, polar=True)
# 繪製折線圖
ax.plot(angles, values, 'o-', linewidth=2)
# 填充顏色
ax.fill(angles, values, alpha=0.25)
 
# 設置圖標上的角度劃分刻度,爲每個數據點處添加標籤
ax.set_thetagrids(angles * 180/np.pi, feature)
 
# 設置雷達圖的範圍
ax.set_ylim(0,5)
# 添加標題
plt.title('活動前後員工狀態表現')
# 添加網格線
ax.grid(True)
 
plt.show()

                                                                      

一般我們用雷達圖時,是爲了比較兩組數據,因此看一下如何用雷達圖比較兩組數據

values_2=[1.7,4.1,3.3,2.6,3.8]
values_2=np.concatenate([values_2,[values_2[0]]])
 
fig=plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, values, 'o-', linewidth=2,label='活動前')
ax.fill(angles, values, alpha=0.25)
 
ax.plot(angles, values_2, 'o-', linewidth=2,label='活動後')
ax.fill(angles, values_2, alpha=0.25)
 
ax.set_thetagrids(angles * 180/np.pi, feature)
ax.set_ylim(0,5)
plt.title('活動前後員工狀態表現')
plt.legend(loc='best')
ax.grid(True)
plt.show()

                                                                     

當有多組數據的時候,爲了代碼的簡潔,我們可以用for循環來畫。

import numpy as np
import matplotlib.pyplot as plt
# 用於正常顯示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
#用於正常顯示符號
plt.rcParams['axes.unicode_minus'] = False
 
# 使用ggplot的繪圖風格,這個類似於美化了,可以通過plt.style.available查看可選值,你會發現其它的風格真的醜。。。
plt.style.use('ggplot')
 
# 構造數據
values1 = [2.6,2.1,3.4,3,4.1]
values2 = [1.7,4.1,3.3,2.6,3.8]
feature = ['個人能力','QC知識','解決問題能力','服務質量意識','團隊精神']
 
# 設置每個數據點的顯示位置,在雷達圖上用角度表示
angles=np.linspace(0, 2*np.pi,len(feature), endpoint=False)
angles=np.concatenate((angles,[angles[0]]))
# 繪圖
fig=plt.figure()
for values in [values1, values2]:
# 拼接數據首尾,使圖形中線條封閉
    values=np.concatenate((values,[values[0]]))
    # 設置爲極座標格式
    ax = fig.add_subplot(111, polar=True)
    # 繪製折線圖
    ax.plot(angles, values, 'o-', linewidth=2)
    # 填充顏色
    ax.fill(angles, values, alpha=0.25)
     
    # 設置圖標上的角度劃分刻度,爲每個數據點處添加標籤
    ax.set_thetagrids(angles * 180/np.pi, feature)
     
    # 設置雷達圖的範圍
    ax.set_ylim(0,5)
# 添加標題
plt.title('活動前後員工狀態表現')
# 添加網格線
ax.grid(True)
 
plt.show()

                                                                  

不過說實話,這個圖形並不怎麼美觀,個人感覺主要是背景顏色得換一下。之前還看到有人用pygal庫(pygal庫繪製世界地圖信息挺不錯)繪圖庫繪製雷達圖

import pygal
 
# 調用Radar這個類,並設置雷達圖的填充,及數據範圍
radar_chart = pygal.Radar(fill = True, range=(0,5))
# 添加雷達圖的標題
radar_chart.title = '活動前後員工狀態表現'
# 添加雷達圖各頂點的含義
radar_chart.x_labels = ['個人能力','QC知識','解決問題能力','服務質量意識','團隊精神']
 
# 繪製兩條雷達圖區域
radar_chart.add('活動前', [3.2,2.1,3.5,2.8,3])
radar_chart.add('活動後', [4,4.1,4.5,4,4.1])
 
# 保存圖像
radar_chart.render_to_file('radar_chart.svg')

              

這個圖就好看很多,而且還是可以交互顯示信息的圖形。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章