【python】matplotlib(radar chart)

在這里插入圖片描述

文章目錄

  • 1、功能描述和原理介紹
  • 2、代碼實現
  • 3、效果展示
  • 4、完整代碼
  • 5、多個雷達圖繪制在一張圖上
  • 6、參考

1、功能描述和原理介紹

基于 matplotlib 實現雷達圖的繪制

一、雷達圖的基本概念

雷達圖(Radar Chart),也被稱為蛛網圖或星型圖,是一種用于可視化多個變量之間關系的圖表形式。它常用于比較多個變量之間的關系,特別是在展示各個維度的綜合表現時非常有用。雷達圖的基本構造是一個圓形網格,代表數據的各個維度。每個維度對應一個頂點,這些頂點通過直線連接,形成一個封閉的多邊形。

二、繪制原理

  • 極坐標系統:
    雷達圖是基于極坐標系統繪制的。在極坐標系統中,點的位置由角度和半徑兩個參數決定。
    在雷達圖中,每個維度對應一個特定的角度,這些角度通常是等間隔分布的。

  • 數據映射:
    在繪制雷達圖之前,需要將數據映射到極坐標系統上。這通常涉及將每個維度的值轉換為對應的半徑長度。
    為了保證各個維度之間的數值比例能夠做同級別的比較,通常需要對數據進行標準化處理。

  • 繪制多邊形:
    繪制雷達圖時,從中心點開始,按照每個維度的角度繪制射線,并在射線上根據數據的值確定數據點的位置。
    將這些數據點依次連接起來,形成一個封閉的多邊形,這個多邊形就是雷達圖的基本形狀。

  • 區域填充:
    為了增強雷達圖的視覺效果,通常會對多邊形內部進行填充。
    填充的顏色、透明度等屬性可以根據需要進行調整。

三、matplotlib繪制雷達圖的步驟

  • 準備數據:
    確定要展示的維度和數據集。
    對數據進行標準化處理(如果需要)。

  • 設置圖形大小和子圖:
    使用 plt.figure() 設置圖形的整體大小。
    使用 plt.subplots() 或 fig.add_subplot() 創建極坐標子圖。

  • 繪制雷達圖:
    使用 ax.plot() 或 ax.fill_between() 等方法繪制雷達圖。
    設置角度和半徑參數,確保數據正確映射到極坐標系統上。

  • 設置標簽和標題:
    使用 ax.set_xticks() 和 ax.set_xticklabels() 設置角度標簽。
    使用 plt.title() 或 ax.set_title() 設置圖形標題。

  • 顯示圖形:
    使用 plt.show() 顯示繪制好的雷達圖。

四、注意事項

  • 數據標準化:在繪制雷達圖之前,通常需要對數據進行標準化處理,以保證各個維度之間的數值比例能夠做同級別的比較。
  • 角度設置:角度的設置應確保每個維度都能均勻分布在雷達圖上。
  • 圖形美觀:可以通過調整顏色、透明度、線型等屬性來增強雷達圖的視覺效果。

2、代碼實現

原始數據

# 漫威英雄
abilities = ['智力', '力量', '速度', '耐力', '能量', '技能']
super_heros = {'美國隊長': [5, 4, 3, 4, 3, 7],'鋼鐵俠': [6, 3, 5, 5, 3, 3],'綠巨人': [6, 7, 3, 7, 1, 5],'蜘蛛俠': [5, 4, 5, 4, 2, 5],'滅霸': [7, 7, 7, 7, 7, 7],'雷神': [2, 5, 6, 7, 6, 6],'緋紅女巫': [3, 3, 3, 3, 7, 3],'黑寡婦': [5, 3, 2, 3, 3, 7],'鷹眼': [5, 3, 3, 2, 2, 7],
}

轉化后的數據


list1 = list(super_heros.keys())
print(f"'group':{list1},")for index, ability in enumerate(abilities):attrib = []for item in super_heros:attrib.append(super_heros[item][index])print(f"'{ability}':", attrib, end=",\n")

output

'group':['美國隊長', '鋼鐵俠', '綠巨人', '蜘蛛俠', '滅霸', '雷神', '緋紅女巫', '黑寡婦', '鷹眼'],
'智力': [5, 6, 6, 5, 7, 2, 3, 5, 5],
'力量': [4, 3, 7, 4, 7, 5, 3, 3, 3],
'速度': [3, 5, 3, 5, 7, 6, 3, 2, 3],
'耐力': [4, 5, 7, 4, 7, 7, 3, 3, 2],
'能量': [3, 3, 1, 2, 7, 6, 7, 3, 2],
'技能': [7, 3, 5, 5, 7, 6, 3, 7, 7],

下面基于處理后的數據繪制雷達圖

首先導入必要的庫函數

import matplotlib.pyplot as plt
import pandas as pd
from math import pi

配置好支持中文顯示

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題

配置繪制的數據

# Set data
df = pd.DataFrame({'group':['美國隊長', '鋼鐵俠', '綠巨人', '蜘蛛俠', '滅霸', '雷神', '緋紅女巫', '黑寡婦', '鷹眼'],'智力': [5, 6, 6, 5, 7, 2, 3, 5, 5],'力量': [4, 3, 7, 4, 7, 5, 3, 3, 3],'速度': [3, 5, 3, 5, 7, 6, 3, 2, 3],'耐力': [4, 5, 7, 4, 7, 7, 3, 3, 2],'能量': [3, 3, 1, 2, 7, 6, 7, 3, 2],'技能': [7, 3, 5, 5, 7, 6, 3, 7, 7],
})

步驟1,創建背景

# ---------- 步驟1 創建背景
def make_spider(row, title, color):# number of variable# 變量類別categories = list(df)[1:]# 變量類別個數N = len(categories)# 設置每個點的角度值angles = [n / float(N) * 2 * pi for n in range(N)]angles += angles[:1]# Initialise the spider plot# 分圖ax = plt.subplot(3, 3, row + 1, polar=True, )plt.subplots_adjust(wspace=0.3, hspace=0.5)# If you want the first axis to be on top:# 設置角度偏移ax.set_theta_offset(pi / 2)# 設置順時針還是逆時針,1或者-1ax.set_theta_direction(-1)# Draw one axe per variable + add labels labels yet# 設置x軸的標簽plt.xticks(angles[:-1], categories, color='grey', size=12)  # 最外圍# Draw ylabels# 畫標簽ax.set_rlabel_position(0)plt.yticks([3, 6, 9], ["3", "6", "9"], color="grey", size=7)  # 內圈plt.ylim(0, 10)  # 英雄的各項數值介于 0-10 之間# Ind# 填充數據values = df.loc[row].drop('group').values.flatten().tolist()values += values[:1]ax.plot(angles, values, color=color, linewidth=2, linestyle='solid')ax.fill(angles, values, color=color, alpha=0.4)# Add a title# 設置標題plt.title(title, size=15, color=color, position=(0.5, 0.5))

代碼解析

九個英雄,布局成 3x3 的形式 ax = plt.subplot(3, 3, row + 1, polar=True, )

可是適當擴大些行列間距,plt.subplots_adjust(wspace=0.3, hspace=0.5),防止圖形繪制的時候重疊

繪制雷達圖

my_dpi = 96
plt.figure(figsize=(1000 / my_dpi, 1000 / my_dpi), dpi=my_dpi)# Create a color palette:
# 設定顏色
my_palette = plt.cm.get_cmap("gist_rainbow", len(df.index))# Loop to plot
for row in range(0, len(df.index)):make_spider(row=row, title='hero ' + df['group'][row], color=my_palette(row))plt.show()

plt.cm.get_cmap 顏色模式有許多種,可以自己選擇

3、效果展示

在這里插入圖片描述

試試更多的例子

在這里插入圖片描述

4、完整代碼

數據處理

# 漫威英雄
abilities = ['智力', '力量', '速度', '耐力', '能量', '技能']
super_heros = {'美國隊長': [5, 4, 3, 4, 3, 7],'鋼鐵俠': [6, 3, 5, 5, 3, 3],'綠巨人': [6, 7, 3, 7, 1, 5],'蜘蛛俠': [5, 4, 5, 4, 2, 5],'滅霸': [7, 7, 7, 7, 7, 7],'雷神': [2, 5, 6, 7, 6, 6],'緋紅女巫': [3, 3, 3, 3, 7, 3],'黑寡婦': [5, 3, 2, 3, 3, 7],'鷹眼': [5, 3, 3, 2, 2, 7],
}# 火影忍者
abilities = ['忍', '體', '幻', '賢', '力', '速', '精', '印']
super_heros = {'旗木卡卡西': [10, 9, 8, 10, 7, 9, 6, 10],'自來也': [10, 9, 6, 9, 9, 9, 10, 9],'綱手': [10, 10, 7, 10, 10, 7, 8, 8],'宇智波鼬': [10, 9, 10, 10, 7, 10, 5, 10],
}list1 = list(super_heros.keys())
print(f"'group':{list1},")for index, ability in enumerate(abilities):attrib = []for item in super_heros:attrib.append(super_heros[item][index])print(f"'{ability}':", attrib, end=",\n")

雷達圖繪制

import matplotlib.pyplot as plt
import pandas as pd
from math import pifrom pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題# Set data
if 1:df = pd.DataFrame({'group':['美國隊長', '鋼鐵俠', '綠巨人', '蜘蛛俠', '滅霸', '雷神', '緋紅女巫', '黑寡婦', '鷹眼'],'智力': [5, 6, 6, 5, 7, 2, 3, 5, 5],'力量': [4, 3, 7, 4, 7, 5, 3, 3, 3],'速度': [3, 5, 3, 5, 7, 6, 3, 2, 3],'耐力': [4, 5, 7, 4, 7, 7, 3, 3, 2],'能量': [3, 3, 1, 2, 7, 6, 7, 3, 2],'技能': [7, 3, 5, 5, 7, 6, 3, 7, 7],})if 0:df = pd.DataFrame({'group':['旗木卡卡西', '自來也', '綱手', '宇智波鼬'],'忍': [10, 10, 10, 10],'體': [9, 9, 10, 9],'幻': [8, 6, 7, 10],'賢': [10, 9, 10, 10],'力': [7, 9, 10, 7],'速': [9, 9, 7, 10],'精': [6, 10, 8, 5],'印': [10, 9, 8, 10],})# ---------- 步驟1 創建背景
def make_spider(row, title, color):# number of variable# 變量類別categories = list(df)[1:]# 變量類別個數N = len(categories)# 設置每個點的角度值angles = [n / float(N) * 2 * pi for n in range(N)]angles += angles[:1]# Initialise the spider plot# 分圖ax = plt.subplot(3, 3, row + 1, polar=True, )plt.subplots_adjust(wspace=0.3, hspace=0.5)# If you want the first axis to be on top:# 設置角度偏移ax.set_theta_offset(pi / 2)# 設置順時針還是逆時針,1或者-1ax.set_theta_direction(-1)# Draw one axe per variable + add labels labels yet# 設置x軸的標簽plt.xticks(angles[:-1], categories, color='grey', size=12)  # 最外圍# Draw ylabels# 畫標簽ax.set_rlabel_position(0)plt.yticks([3, 6, 9], ["3", "6", "9"], color="grey", size=7)  # 內圈plt.ylim(0, 10)# Ind# 填充數據values = df.loc[row].drop('group').values.flatten().tolist()values += values[:1]ax.plot(angles, values, color=color, linewidth=2, linestyle='solid')ax.fill(angles, values, color=color, alpha=0.4)# Add a title# 設置標題plt.title(title, size=15, color=color, position=(0.5, 0.5))# ---------- 步驟2 繪制圖形
my_dpi = 96
plt.figure(figsize=(1000 / my_dpi, 1000 / my_dpi), dpi=my_dpi)# Create a color palette:
# 設定顏色
my_palette = plt.cm.get_cmap("gist_rainbow", len(df.index))# Loop to plot
for row in range(0, len(df.index)):make_spider(row=row, title=df['group'][row], color=my_palette(row))plt.show()

5、多個雷達圖繪制在一張圖上

# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pifrom pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題# Set data
df = pd.DataFrame({'group': ['旗木卡卡西', '自來也', '綱手', '宇智波鼬'],'忍': [10, 10, 10, 10],'體': [9, 9, 10, 9],'幻': [8, 6, 7, 10],'賢': [10, 9, 10, 10],'力': [7, 9, 10, 7],'速': [9, 9, 7, 10],'精': [6, 10, 8, 5],'印': [10, 9, 8, 10],
})# ---------- 步驟1 創建背景# number of variable
# 變量類別
categories = list(df)[1:]
# 變量類別個數
N = len(categories)# 設置每個點的角度值
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]# Initialise the spider plot
# 初始化極坐標網格
ax = plt.subplot(111, polar=True)# If you want the first axis to be on top:
# 設置角度偏移
ax.set_theta_offset(pi / 2)
# 設置順時針還是逆時針,1或者-1
ax.set_theta_direction(-1)# Draw one axe per variable + add labels labels yet
# 設置x軸的標簽
plt.xticks(angles[:-1], categories)# Draw ylabels
# 畫標簽
ax.set_rlabel_position(0)
plt.yticks([3, 6, 9], ["3", "6", "9"], color="grey", size=7)
plt.ylim(0, 10)# ---------- 步驟1 繪制數據# 單獨繪制每一組數據
my_palette = plt.cm.get_cmap("rainbow", len(df.index))  # 顏色
for index in range(len(df["group"])):values = df.loc[index].drop('group').values.flatten().tolist()values += values[:1]ax.plot(angles, values, color=my_palette(index),linewidth=1, linestyle='solid', label=df["group"][index])ax.fill(angles, values, color=my_palette(index), alpha=0.2)# Add legend
# 添加圖例
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))
plt.show()

在這里插入圖片描述

my_palette = plt.cm.get_cmap("rainbow", len(df.index)) # 顏色 可以自由搭配顏色模式

6、參考

  • https://github.com/chenqionghe/generate-ability-map/tree/master
  • [python] 基于matplotlib實現雷達圖的繪制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65351.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(三)通過WebGL繪制一個簡單的三角形來理解渲染管線

理解 WebGL 繪圖原理的關鍵是了解它的渲染管線。WebGL 渲染管線實際上是由多個階段組成的,每個階段都有特定的任務,最終輸出的是屏幕上的圖像。為了讓你能輕松理解這些原理,我將通過一個簡單的例子來詳細解釋。 繪制一個簡單的三角形 我們將…

【shell編程】報錯信息:bash: bad file descriptor(包含6種解決方法)

大家好,我是搖光~ 在運行 Shell 腳本時,遇到 bash: bad file descriptor 錯誤通常意味著腳本嘗試對一個無效或不可用的文件描述符(file descriptor)執行了讀寫操作。 以下是一些可能導致這個問題的原因、詳細案例以及相應的解決…

Kafka3.x KRaft 模式 (沒有zookeeper) 常用命令

版本號:kafka_2.12-3.7.0 說明:如有多個地址,用逗號分隔 創建主題 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1刪除主題 bin/kafka-topics.sh --delete --boots…

Business Cooperation Process

Business Cooperation Process 商務合作基本流程 并不是每個人都能做到言而有信的,因此還是需要流程來約束的。

模式識別-Ch2-分類錯誤率

分類錯誤率 最小錯誤率貝葉斯決策 樣本 x x x的錯誤率: 任一決策都可能會有錯誤。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

Milvus×全診通:從導診到智能超聲,如何將人效比翻倍

AI與智慧醫療的結合已是未來發展的必然趨勢。近年來,國家衛健委推崇智慧醫療和AI技術,如智能導診、預問診、輔助診斷等,以提高醫療服務效率和診斷準確性,改善患者就醫體驗。 全診通是一家專注于醫療SaaS和人工智能的公司&#xff…

自動駕駛相關知識學習筆記

一、概要 因為想知道SIL、HIL是什么仿真工具,故而瀏覽了自動駕駛相關的知識。 資料來源《自動駕駛——人工智能理論與實踐》胡波 林青 陳強 著;出版時間:2023年3月 二、圖像的分類、分割與檢測任務區別 如圖所示,這些更高階的…

springcloud 介紹

Spring Cloud是一個基于Spring Boot的微服務架構解決方案集合,它提供了一套完整的工具集,用于快速構建分布式系統。在Spring Cloud的架構中,服務被拆分為一系列小型、自治的微服務,每個服務運行在其獨立的進程中,并通過…

Blazor用戶身份驗證狀態詳解

在 Blazor 應用程序中,AuthenticationState 是一個核心概念,用于表示用戶的身份驗證狀態。它提供有關當前用戶的信息,例如是否已登錄、用戶的身份信息(如用戶名、角色等)。 AuthenticationState 通常由 Authenticatio…

VAxios

VAxios(或v-axios)是一個基于Axios的Vue插件,旨在讓開發者在Vue項目中更方便、快捷地引入和使用Axios。以下是對VAxios的詳細介紹: 一、功能與特性 VAxios作為Axios的Vue封裝插件,繼承了Axios的眾多特性,…

什么是 ERP?

目錄 企業資源計劃(ERP)的定義 ERP與財務管理的區別 ERP基礎知識 ERP的業務價值 ERP簡史 ERP部署模式:從本地部署到云端 ERP云 — 新的ERP交付模式 遷移至ERP云技術解決方案的7個原因 企業資源計劃(ERP)的定義 …

Linux環境下確認并操作 Git 倉庫

在軟件開發和版本控制中,Git 已成為不可或缺的工具。有時,我們需要確認某個目錄是否是一個 Git 倉庫,并在該目錄中運行腳本。本文將詳細介紹如何確認 /usr/local/src/zcxt/backend/policy-system-backend 目錄是否是一個 Git 倉庫&#xff0c…

【PLL】非線性瞬態性能

頻率捕獲、跟蹤響應,是大信號非線性行為鎖相范圍內的相位、頻率跟蹤,不是非線性行為 所以:跟蹤,是線性區域;捕獲,是大信號、非線性區域 鎖定范圍:沒有周跳(cycle-slipping&#xff0…

QML學習(七) 學習QML時,用好Qt設計器,快速了解各個組件的屬性

在初步學習QML時,特別建議看看Qt設計器,先利用Qt Quick設計師的使用,快速的對Qt Quick的各個組件及其常用的屬性,有個初步的了解和認識。如果初始學習一上來直接以代碼形式開干,很容易一頭霧水。而設計器以最直白的所見…

回調函數和工廠模式

回調函數和工廠模式可以結合使用,以實現靈活的對象創建和動態行為。這種結合通常用于需要根據特定條件創建對象并在對象上執行某些操作的場景。以下是如何將回調函數與工廠模式結合的示例和解釋。 結合使用的場景 動態對象創建:使用工廠模式創建不同類型…

find 查找文件grep匹配數據

一、find介紹 1. find . -iname "*.txt"查找當前目錄下各個文件夾下的txt屬性的文件(i忽略大小寫)。 2.find . -type f 查找當前目錄下各個文件夾下的文件 3.find . -type d 查找當前目錄下各個文件夾下的目錄 4.find . -type f | xargs grep -ain -E "匹配…

Mac上鴻蒙配置HDC報錯:zsh: command not found: hdc -v

這個問題困擾了好久,按照官方文檔去配置的,就是會一直報錯,沒有配置成功,主要原因是官網ide的路徑可能和你本地的ide的路徑不一致,因為官網的ide版本可能是最新的 一.先查找你本地的toolchains目錄在哪里,…

CS·GO搬磚流程詳細版

說簡單點,就是Steam買了然后BUFF上賣,或許大家都知道這點,但就是一些操作和細節問題沒那么明白。我相信,你看完這篇文章以后,至少會有新的認知。 好吧,廢話少說,直接上實操! 首先準…

“深入淺出”系列之FFmpeg:(1)音視頻開發基礎

我的音視頻開發大部分內容是跟著雷霄驊大佬學習的,所以筆記也是跟雷老師的博客寫的。 一、音視頻相關的基礎知識 首先播放一個視頻文件的流程如下所示: FFmpeg的作用就是將H.264格式的數據轉換成YUV格式的數據,然后SDL將YUV顯示到電腦屏幕上…

【Linux】Linux開發:GDB調試器與Git版本控制工具指南

Linux相關知識點可以通過點擊以下鏈接進行學習一起加油!初識指令指令進階權限管理yum包管理與vim編輯器GCC/G編譯器make與Makefile自動化構建 在 Linux 開發中,GDB 調試器和 Git 版本控制工具是開發者必備的利器。GDB 幫助快速定位代碼問題,G…