【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.rhkb.cn/news/503584.html

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

相关文章

鸿蒙APP之从开发到发布的一点心得

引言: 做鸿蒙开发大概有1年左右时间了,从最开始的看官方文档、看B站视频,到后来成功发布两款个人APP(房贷计算极简版、时简时钟 轻喷,谢谢)。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…

Clisoft SOS与CAD系统集成

Clisoft SOS与CAD系统集成 以下内容大部分来自官方文档,目前只用到与Cadence Virtuoso集成,其他还未用到,如有问题或相关建议,可以留言。 与Keysight ADS集成 更新SOS客户端配置文件sos.cfg,以包含支持ADS的模板&am…

IP查询于访问控制保护你我安全

IP地址查询 查询方法: 命令行工具: ①在Windows系统中,我们可以使用命令提示符(WINR)查询IP地址,在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息; ②在Linux系统中&…

人工智能训练师一级(高级技师)、二级(技师)考试指南

随着经济快速发展,人工智能技术在制造业、交通运输、农业、医疗健康、金融服务、物流配送以及城市服务等多个领域得到了广泛的应用。不仅带来产业的转型升级,更是对具备相应技能的人工智能训练师需求的激增。 根据教育部发布的《关于做好职业教育“…

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块,PCIE转以太网模块、 USB转以太网模块等,这样我们的网络需求就不止是上网这么简单了,可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…

patchwork++地面分割学习笔记

参考资料:古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容:提出了以下四个部分:RNR、RVPF、A-GLE 和 TGR。 1)基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

关于Mac中的shell

1 MacOS中的shell 介绍: 在 macOS 系统中,Shell 是命令行与系统交互的工具,用于执行命令、运行脚本和管理系统。macOS 提供了多种 Shell,主要包括 bash 和 zsh。在 macOS Catalina(10.15)之前&#xff0c…

IO: 作业:Day1

思维导图 main.c #include"student.h" int main(int argc, const char *argv[]) { stuPtr hcreat(); int n0; add_node(h); add_node(h); add_node(h); show(h); save(h,"student.txt"); stuPtr ptrc…

java 转义 反斜杠 Unexpected internal error near index 1

代码: String str"a\\c"; //出现异常,Unexpected internal error near index 1 //System.out.println(str.replaceAll("\\", "c"));//以下三种都正确 System.out.println(str.replace(\\, c)); System.out.println(str.r…

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号(;)结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

面向对象的思维hong

首尾相连和转多段线

Mysql--基础篇--数据类型(整数,浮点数,日期,枚举,二进制,空间类型等)

MySQL提供了多种数据类型,用于定义表中列的数据格式。选择合适的数据类型不仅可以提高查询性能,还能确保数据的完整性和准确性。 一、数值类型 数值类型用于存储整数、浮点数和定点数。根据精度和范围的不同,数值类型可以分为以下几类&…

nlp培训重点-2

1. 贝叶斯公式 import math import jieba import re import os import json from collections import defaultdictjieba.initialize()""" 贝叶斯分类实践P(A|B) (P(A) * P(B|A)) / P(B) 事件A:文本属于类别x1。文本属于类别x的概率,记做…

sunrays-framework(太阳射线框架搭建)

文章目录 1.基本环境搭建1.创建项目sunrays-framework2.新增忽略文件3.删除src目录4.交给Git管理 2.sunrays-dependencies模块:统一管理依赖1.创建模块2.不要交给父模块管理,这是独立的!!!3.删除src目录4.pom.xml统一管…

JVM vs JDK vs JRE

JVM是Java虚拟机的缩写, 用于实现Java的一次编译,处处运行。 Java代码写成.class后,由本地的虚拟机运行。 JDK(Java Development Kit)是一个功能齐全的 Java 开发工具包,供开发者使用。 JDK包含了JRE。…

Android修改开机动画路径

frameworks\base\cmds\bootanimation\BootAnimation.cpp 路径的定义 优先查找的顺序

select下拉框,首次进入页面没有显示value的情况

bug场景: 类似这种bug情况排查如下: 首先 理解含义 options就是存放键值对的,id就是key,对上了它就自动把label显示 而且如果你用来当作key和label的字段,与后端返回的不一致,还可以进行更改 其次 排查接…

Redis中的主从/Redis八股

四、Redis主从 1.搭建主从架构 不像是负载均衡,这里是主从,是因为redis大多数是读少的是写 步骤 搭建实例(建设有三个实例,同一个ip不同端口号) 1)创建目录 我们创建三个文件夹,名字分别叫700…

Mysql--基础篇--函数(字符串函数,日期函数,数值函数,聚合函数,自定义函数及与存储过程的区别等)

MySQL提供了丰富的内置函数,涵盖了字符串处理、数值计算、日期和时间操作、聚合统计、控制流等多种功能。这些函数可以帮助你简化SQL查询,提升开发效率。 除了内置函数,MySQL还支持自定义函数(User-Defined Functions)…

【linux系统之redis6】redis的安装与初始化

下载redis的linux对应的安装包,并上传到linux虚拟机里面 解压压缩包 tar -zxzf redis-6.2.6.tar.gz解压后,进入redis文件 cd redis-6.2.6执行编译 make && make install看到下图,就说明redis安装成功了 默认的安装路径&#xff0c…