最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python繪制極坐標(biāo)雷達圖

 更新時間:2022年02月07日 15:06:38   作者:伊滴小朋友  
大家好,本篇文章主要講的是用python繪制極坐標(biāo)雷達圖,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

綜述

python的matplotlib畫圖庫的功能非常強大,可以畫很多很多種圖,我們?nèi)粘I钪杏龅降睦走_圖也不例外。

雷達圖也被稱為網(wǎng)絡(luò)圖,蜘蛛圖,星圖等,是一個不規(guī)則的多邊形。雷達圖可以形象地展示相同事物的多維指標(biāo),應(yīng)用場景非常多,比如本篇博客中,用來展示球員的不同能力的區(qū)別。

matplotlib庫中的雷達圖繪制是基于極坐標(biāo)的,因此所有的數(shù)據(jù)和標(biāo)簽都要根據(jù)角度來計算出位置。

本篇博客將詳細(xì)的解釋繪制雷達圖過程中的思路、過程以及各個函數(shù)方法的詳細(xì)解析,如有不正確的地方歡迎大佬指正~

繪圖代碼和解析

繪制一張多主體雷達圖

所謂多主體雷達圖,就是在一張圖中顯示多個多邊形組成的屬性圖,形成直觀的對比。

預(yù)處理

對應(yīng)的包下好,然后解決一下中文和符號顯示的問題,設(shè)置默認(rèn)的字體,修改繪圖樣式;

加載數(shù)據(jù)集(我這里的數(shù)據(jù)集來源:某綠色足球app),提取字典中的鍵和值分別保存在labels和score當(dāng)中。

import numpy as np
import matplotlib.pyplot as plt

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ù)長度進行等分,形成角度列表
angles = np.linspace(0, 2 * np.pi, data_length, endpoint=False)

# 分離屬性字段和數(shù)據(jù)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]

封閉雷達圖

由于我們畫出來的圖是一個封閉的多邊形,而我們提取出來的score、labels和angles數(shù)據(jù)的每一項并不是首尾相接的,因此我們需要把每一個列表的第一項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]]))

這里因為我弄了三個球員的數(shù)據(jù),所以有三條score數(shù)據(jù)。

提一下np.concatenate函數(shù),這是一個numpy庫中對多個數(shù)組進行合并的函數(shù),參數(shù)格式為:concatenate((arr1,arr2,arr3),axis=0),第一個括號里面是要合并的數(shù)組,可以填任意個,第二個axis參數(shù),與合并方式有關(guān),這里我們用不到就不多贅述了。

繪制圖像

繪制圖像基本跟繪制條形圖的步驟差不多,有幾個可以注意的點:

plot函數(shù)中,繪制條形圖是按照“橫坐標(biāo)-縱坐標(biāo)”來填寫第一和第二個參數(shù)的,由于我們雷達圖是基于極坐標(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)

# 新建一個子圖
ax = plt.subplot(111, polar=True)

# 繪制雷達圖并填充顏色
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è)置雷達圖中每一項的標(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è)置雷達圖的坐標(biāo)刻度范圍

ax.set_rlabel_position(270)  # 設(shè)置雷達圖的坐標(biāo)值顯示角度,相對于起始角度的偏移量
ax.set_title("熱刺球員能力對比圖")
plt.legend(["哈里·凱恩", "孫興愍", "托比"], loc='lower left')

plt.show()

完整代碼:

import numpy as np
import matplotlib.pyplot as plt

# 解決中文顯示問題
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ù)長度進行等分

# 分離屬性字段和數(shù)據(jù)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]

# 使雷達圖數(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)

# 新建一個子圖
ax = plt.subplot(111, polar=True)

# 繪制雷達圖并填充顏色
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è)置雷達圖中每一項的標(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è)置雷達圖的坐標(biāo)刻度范圍

ax.set_rlabel_position(270)  # 設(shè)置雷達圖的坐標(biāo)值顯示角度,相對于起始角度的偏移量
ax.set_title("熱刺球員能力對比圖")
plt.legend(["哈里·凱恩", "孫興愍", "托比"], loc='lower left')

plt.show()

最后得到的雷達圖:

在這里插入圖片描述

還是挺好看的(?)

繪制多張單主體雷達圖

數(shù)據(jù)處理部分跟上面一樣,我們直接從畫圖講起。

建立子圖

首先我們用plt.figure繪制好基本畫布之后,需要建立三個子圖(因為有三個球員):

ax1 = plt.subplot(131, polar=True)
ax2 = plt.subplot(132, polar=True)
ax3 = plt.subplot(133, polar=True)

我們把整個畫布看作一個矩陣,有m行n列;

第一個參數(shù)是一個三位數(shù),第一位表示該子圖在整個畫布的行位置,1表示總共把畫布劃分為1行;第二位表示列,3表示總共把畫布劃分為3列;第三個表示索引值,指的是具體的位置,按照從上到下從左到右排列,比如在一個2*2的畫布中,索引值為3表示在第二行第一個;

循環(huán)遍歷畫每個子圖

首先把畫圖用的子圖、數(shù)據(jù)、標(biāo)簽、顏色都用列表存起來,方便遍歷;

遍歷每一個子圖:

首先畫角度坐標(biāo)軸和框線,’-.'表示框線的樣式是有一個小線段加一個點組成,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"]

for i in range(3):
    # 繪制角度軸和框線
    for j in np.arange(0, 100+20, 20):
        ax[i].plot(angles, 7*[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=color[i])
    ax[i].fill(angles, data[i], color=color[i], alpha=0.4)

    # 數(shù)據(jù)下標(biāo)
    for a, b in zip(angles, data[i]):
        ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=10, color='black')

    # 參數(shù)設(shè)置
    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])

最后得到效果(個人審美有限,不喜勿噴):

在這里插入圖片描述

總體來說,強大的matplotlib + 靈活運用代碼 + 美化 = 一幅好看的雷達圖~

總結(jié)

到此這篇關(guān)于用python繪制極坐標(biāo)雷達圖的文章就介紹到這了,更多相關(guān)python坐標(biāo)雷達圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python列表生成式和字典生成式實例

    Python列表生成式和字典生成式實例

    這篇文章主要介紹了Python列表生成式和字典生成式實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python中使用YAML文件進行配置文件管理

    Python中使用YAML文件進行配置文件管理

    配置文件管理已經(jīng)成為了一個不可或缺的環(huán)節(jié)。它們包含了程序運行所需的各種參數(shù),本文主要介紹了Python中使用YAML文件進行配置文件管理,感興趣的可以了解一下
    2023-12-12
  • 詳解操作python容器的內(nèi)置通用函數(shù)

    詳解操作python容器的內(nèi)置通用函數(shù)

    這篇文章主要為大家介紹了操作python容器的內(nèi)置通用函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python數(shù)據(jù)分析Matplotlib?柱狀圖繪制

    Python數(shù)據(jù)分析Matplotlib?柱狀圖繪制

    本文主要介紹了Python數(shù)據(jù)分析Matplotlib柱狀圖繪制,Matplotlib提供了bar()方法繪制柱狀圖,下面具體繪制介紹需要的小伙伴可以參考以一下
    2022-05-05
  • python在指定位置插入字符的實現(xiàn)

    python在指定位置插入字符的實現(xiàn)

    本文主要介紹了python在指定位置插入字符的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 簡單理解Python中的裝飾器

    簡單理解Python中的裝飾器

    這篇文章主要介紹了Python中的裝飾器,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • python實現(xiàn)文件路徑和url相互轉(zhuǎn)換的方法

    python實現(xiàn)文件路徑和url相互轉(zhuǎn)換的方法

    這篇文章主要介紹了python實現(xiàn)文件路徑和url相互轉(zhuǎn)換的方法,以URL轉(zhuǎn)換成文件路徑為例分析了Python實現(xiàn)地址轉(zhuǎn)換的技巧,需要的朋友可以參考下
    2015-07-07
  • Python利器openpyxl之操作excel表格

    Python利器openpyxl之操作excel表格

    這篇文章主要給大家介紹了關(guān)于Python利器openpyxl之操作excel表格的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python復(fù)數(shù)屬性和方法運算操作示例

    Python復(fù)數(shù)屬性和方法運算操作示例

    這篇文章主要介紹了Python復(fù)數(shù)屬性和方法運算操作,結(jié)合實例形式分析了Python復(fù)數(shù)運算相關(guān)操作技巧,代碼注釋備有詳盡說明,需要的朋友可以參考下
    2017-07-07
  • Ollama Python 使用小結(jié)

    Ollama Python 使用小結(jié)

    Ollama提供了Python SDK,使得開發(fā)者能夠在Python環(huán)境中輕松集成和使用本地運行的模型進行自然語言處理任務(wù),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

五华县| 涞源县| 宁阳县| 依兰县| 江永县| 石阡县| 万年县| 瑞丽市| 海原县| 娄底市| 荥经县| 靖州| 瑞昌市| 阜宁县| 平乐县| 大庆市| 布拖县| 山西省| 泰顺县| 修武县| 临夏县| 化德县| 高台县| 北票市| 澄迈县| 正安县| 榆社县| 舞钢市| 长葛市| 福安市| 铁力市| 南投县| 无锡市| 普兰店市| 鄂托克前旗| 南丰县| 宁陵县| 泰和县| 大埔区| 南川市| 慈溪市|