【python】matplotlib(radar chart)

news2025/1/8 10:58:17

在这里插入图片描述

文章目录

  • 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或者-1
    ax.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 pi

from 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或者-1
    ax.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 pi

from 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.coloradmin.cn/o/2273166.html

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

相关文章

数据库环境安装(day1)

网址:MySQL 下载(环境准备): (2-5点击此处,然后选择合适的版本) 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…

Fabric链码部署测试

参考链接:运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) (2)fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

数据结构与算法之二叉树: LeetCode 107. 二叉树的层序遍历 II (Ts版)

二叉树的层序遍历 II https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/ 描述 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历&a…

Python插件化开发实战:开发个图片浏览器

在本篇教程中,我将详细介绍如何使用Python开发一个基于插件架构的图片浏览器。这个项目将展示如何实现插件系统、如何处理图片显示,以及如何使用wxPython构建GUI界面。 “C:\pythoncode\pythonplugin\your_project\main_app.py” 项目概述 我们将开发一个具有以下…

根据python代码自动生成类图的实现方法[附带python源码]

概述 利用python库抽象语法树(AST)和类图描述语言(PlantUML),实现自动将python代码生成类图的目的。 环境 windowsvscodepythonplantuml ✒️网上好像大部分都是用Pyreverse库来实现的,但是我实际测试发现只能在一个文件中才能行,当然应该有解决方法…

下载b站高清视频

需要使用的edge上的一个扩展插件,所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站,登录自己账号(登录后才能下载到高清!!)。打开一个视频,选择自…

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年,这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合,大大提高了研发效率。在开发过程中,也遇到了一些性能相关问题和…

UE5 打包要点

------------------------- 1、需要环境 win sdk ,大约3G VS,大约10G 不安装就无法打包,就是这么简单。 ----------------------- 2、打包设置 编译类型,开发、调试、发行 项目设置-地图和模式,默认地图 项目…

vulnhub靶场【DC系列】之5

前言 靶机:DC-5,IP地址为192.168.10.4 攻击:kali,IP地址为192.168.10.2 都采用VMWare,网卡为桥接模式 对于文章中涉及到的靶场以及工具,我放置网盘中https://pan.quark.cn/s/2fcf53ade985 主机发现 使用…

双模态视觉特征流用于医学报告生成|文献速递-视觉大模型医疗图像应用

Title 题目 Dual-modality visual feature flow for medical report generation 双模态视觉特征流用于医学报告生成 01 文献速递介绍 医学报告生成是一项新兴的跨模态文本生成任务(X. Zeng et al., 2020;Najdenkoska et al., 2022;Li et…

基于Fluent和深度学习算法驱动的流体力学计算与应用

物理模型与深度学习的融合:研究如何将传统的物理模型与深度学习算法相结合,以提高流体力学问题的预测准确性和计算效率。复杂流动模拟:利用深度学习技术对复杂流动现象进行模拟和分析,包括湍流、多相流、非牛顿流体等,…

记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-动态表单(2)

接1的内容,那么有这么一个需求! 需求分析 需要修改某一个配置的时候 1.从对应的api中读取消息,消息内容为Json格式的 2.基于当前的Json渲染成表单提供给管理端的客户呈现 3.管理端的用户可以基于这个表单的内容进行修改,然后提交…

pycharm-pyspark 环境安装

1、环境准备:java、scala、pyspark、python-anaconda、pycharm vi ~/.bash_profile export SCALA_HOME/Users/xunyongsun/Documents/scala-2.13.0 export PATH P A T H : PATH: PATH:SCALA_HOME/bin export SPARK_HOME/Users/xunyongsun/Documents/spark-3.5.4-bin…

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件,可能有些方面不够完善,欢迎大佬指点。 这里就不演示创建创建Server和Project,可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

数据结构:LinkedList与链表—无头双向链表(二)

目录 一、什么是LinkedList? 二、LinkedList的模拟实现 1、display()方法 2、addFirst(int data)方法 3、addLast(int data)方法 4、addIndex(int index,int data)方法 5、contains(int key)方法 6、remove(int key)方法 7、removeAllKey(int key)方法 8、…

基于SpringBoot实现的保障性住房管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

【Linux】硬链接和软连接(符号连接)

目录 硬链接 软连接 硬链接和软连接的区别 硬链接 ln根据linux系统分配给文件inode(ls -li)进行建立,没办法跨越文件系统 格式:ln 被链接的文件(源文件) 生成的链接文件(目标文件) 1) 硬链接的属性 - 相当于生成一个副本 起别名 2) 修改内容都变化…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA) 一、算法简介 简介: 现有的多目标进化算法(moea)在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题(MOPs&#xff…

基于SpringBoot的乐器商城购物推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【vba源码】自动获取汇率

Hi,大家好! 没有想到今天居然是腊八,过了腊八就是年,离过年越来越近了,那在这里给大家就拜个年,希望大家在新的一年都有好事发生。 最近在弄点小项目,在项目遇到了一个汇率计算的问题&#xff…