之前在一些資料分析案例中看到用 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()
不過說實話,這個圖形并不怎麼美觀,個人感覺主要是背景顔色得換一下。之前還看到有人用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')
這個圖就好看很多,而且還是可以互動顯示資訊的圖形。