【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.mzph.cn/web/65351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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的架构中,服务被拆分为一系列小型、自治的微服务,每个服务运行在其独立的进程中,并通过…

【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…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…

【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 二叉排序树的基本概念 2. 二叉排序树节点结构体定义 3. 创建二叉排序树 4. 判断是否为二叉排序树 5. 递归查找关键字为 6 的结点并输出查找路径 6. 删除二叉排序树中的节点 测试说明 通关代码 测试结果 任务描述 本关任务&a…

Linux(17)——使用 DNF 安装和更新软件包

目录 一、使用 DNF 管理软件包: 1、 DNF 查找软件: 2、DNF 安装软件: 3、DNF 删除软件: 二、使用 DNF 管理软件包组: 1、DNF 显示组信息: 2、DNF 安装组: 三、使用 DNF 查看事务历史记录…

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…