编程实战(3)——python绘制极坐标雷达图

2023-11-14

编程实战(3)——python绘制极坐标雷达图

综述

python的matplotlib画图库的功能非常强大,可以画很多很多种图,我们日常生活中遇到的雷达图也不例外。

雷达图也被称为网络图,蜘蛛图,星图等,是一个不规则的多边形。雷达图可以形象地展示相同事物的多维指标,应用场景非常多,比如本篇博客中,用来展示球员的不同能力的区别。

matplotlib库中的雷达图绘制是基于极坐标的,因此所有的数据和标签都要根据角度来计算出位置。

本篇博客将详细的解释绘制雷达图过程中的思路、过程以及各个函数方法的详细解析,如有不正确的地方欢迎大佬指正~

绘图代码和解析

绘制一张多主体雷达图

所谓多主体雷达图,就是在一张图中显示多个多边形组成的属性图,形成直观的对比。

预处理

对应的包下好,然后解决一下中文和符号显示的问题,设置默认的字体,修改绘图样式;

加载数据集(我这里的数据集来源:某绿色足球app),提取字典中的键和值分别保存在labels和score当中。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.style.use('ggplot')  # 设置ggplot主题样式

# 原始数据集并获取数据集长度
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)

# 分离属性字段和数据
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]

如果有兴趣的话可以参考一下这篇博客:plt.style.use设置背景样式参数详解 我选了我觉得比较好看的ggplot主题;

封闭雷达图

由于我们画出来的图是一个封闭的多边形,而我们提取出来的score、labels和angles数据的每一项并不是首尾相接的,因此我们需要把每一个列表的第一项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]]))

这里因为我弄了三个球员的数据,所以有三条score数据。

提一下np.concatenate函数,这是一个numpy库中对多个数组进行合并的函数,参数格式为:concatenate((arr1,arr2,arr3),axis=0),第一个括号里面是要合并的数组,可以填任意个,第二个axis参数,与合并方式有关,这里我们用不到就不多赘述了。

绘制图像

绘制图像基本跟绘制条形图的步骤差不多,有几个可以注意的点:

  • plot函数中,绘制条形图是按照“横坐标-纵坐标”来填写第一和第二个参数的,由于我们雷达图是基于极坐标的,matplotlib也很智能的提供了“角度-半径”的极坐标参数填写方式;
  • 关于颜色参数可以参考这个:plt.plot颜色大全plot中的颜色只管边框颜色,fill函数中的颜色是填充颜色,可以自由组合追求美观;
  • fill函数中的alpha参数指的是覆盖区的透明度,越小表示越透明,区间0-1;
  • plt.legend图例函数中的loc,是描述图例位置的,详细可以参考:图例位置调整详解

代码如下:

# 设置图形的大小
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)

# 设置雷达图中每一项的标签显示
ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=15)

ax.set_theta_zero_location('E')  # 设置0度坐标轴起始位置,东西南北

ax.set_rlim(0, 100)  # 设置雷达图的坐标刻度范围

ax.set_rlabel_position(270)  # 设置雷达图的坐标值显示角度,相对于起始角度的偏移量
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']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
plt.style.use('ggplot')  # 设置ggplot样式

# 原始数据集并获取数据集长度
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)  # 将极坐标根据数据长度进行等分

# 分离属性字段和数据
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]

# 使雷达图数据封闭
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]]))

# 设置图形的大小
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)

# 设置雷达图中每一项的标签显示
ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=15)

ax.set_theta_zero_location('E')  # 设置0度坐标轴起始位置,东西南北

ax.set_rlim(0, 100)  # 设置雷达图的坐标刻度范围

ax.set_rlabel_position(270)  # 设置雷达图的坐标值显示角度,相对于起始角度的偏移量
ax.set_title("热刺球员能力对比图")
plt.legend(["哈里·凯恩", "孙兴愍", "托比"], loc='lower left')

plt.show()

最后得到的雷达图:

在这里插入图片描述

还是挺好看的(?)

绘制多张单主体雷达图

数据处理部分跟上面一样,我们直接从画图讲起。

建立子图

首先我们用plt.figure绘制好基本画布之后,需要建立三个子图(因为有三个球员):

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

我们把整个画布看作一个矩阵,有m行n列;

第一个参数是一个三位数,第一位表示该子图在整个画布的行位置,1表示总共把画布划分为1行;第二位表示列,3表示总共把画布划分为3列;第三个表示索引值,指的是具体的位置,按照从上到下从左到右排列,比如在一个2*2的画布中,索引值为3表示在第二行第一个;

循环遍历画每个子图

首先把画图用的子图、数据、标签、颜色都用列表存起来,方便遍历;

遍历每一个子图:

  • 首先画角度坐标轴和框线,’-.'表示框线的样式是有一个小线段加一个点组成,lw是linewidth的缩写,表示线的粗细;
  • 先绘制沿半径方向的等值线,再绘制角度轴;
  • 绘图并填充颜色,跟上面一样;
  • 标出数据下标,ha和va是调整水平和垂直方向的位置
  • 最后调整labels、坐标值范围等参数
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)

    # 数据下标
    for a, b in zip(angles, data[i]):
        ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=10, color='black')

    # 参数设置
    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 + 灵活运用代码 + 美化 = 一幅好看的雷达图~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程实战(3)——python绘制极坐标雷达图 的相关文章

  • 当我有自定义身份验证模型时,如何登录 Django Rest 可浏览 API?

    我有一个自定义用户模型 如下所示account models py from django contrib auth modles import AbstractUser from django db models signals impo
  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 将 numpy 数组合并为单个 int

    numpy 数组怎么可以这样 10 22 37 45 转换为单个 int32 数字 如下所示 10223745 这可以工作 gt gt gt int join map str 10 22 37 45 10223745 基本上你使用map s
  • 反编译Python 3.9.2的PYC文件[重复]

    这个问题在这里已经有答案了 目前 我有一个 3 9 2 版本的 python 的 PYC 文件 P S 这适用于所有 3 9 及更高版本 我正在尝试反编译 PYC 文件 但它显示错误 因为 uncompyle6 或者更确切地说 新版本 de
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • Matplotlib:如何有效地将大量线段着色为独立渐变

    Python 绘图库 如何有效地将大量线段着色为独立渐变 已经 阅读this https stackoverflow com questions 8500700 how to plot a gradient color line in ma
  • Series.sort() 和 Series.order() 有什么区别?

    s pd Series nr randint 0 10 5 index nr randint 0 10 5 s Output 1 3 7 6 2 0 9 7 1 6 order 按值排序并返回一个新系列 s order Output 2 0
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • AttributeError:“模块”对象没有属性[重复]

    这个问题在这里已经有答案了 我有两个 python 模块 a py import b def hello print hello print a py print hello print b hi b py import a def hi
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • pandas 相当于 np.where

    np where具有向量化 if else 的语义 类似于 Apache Spark 的when otherwise数据帧方法 我知道我可以使用np where on pandas Series but pandas通常定义自己的 API
  • 如何查找或安装适用于 Python 的主题 tkinter ttk

    过去 3 个月我一直在制作一个机器人 仅用代码就可以完美运行 现在我的下一个目标是为它制作一个 GUI 但是我发现了一些障碍 主要的一个是能够看起来不像一个 30 年前的程序 我使用的是 Windows 7 我仅使用 Python 3 3
  • 是否需要关闭没有引用它们的文件?

    作为一个完全的编程初学者 我试图理解打开和关闭文件的基本概念 我正在做的一项练习是创建一个脚本 允许我将内容从一个文件复制到另一个文件 in file open from file indata in file read out file
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某

随机推荐

  • 笔记-Flutter 之点击空白处取消TextField焦点

    本人是做iOS开发的 点击空白处取消TextField焦点这个需求是非常简单的 在学习Flutter过程中 面对这个需求走了不少弯路 现在得到了一个感觉不错的解决方案 这里和大家分享一下 也希望对小伙伴们有所帮助 GestureDetect
  • 程序设计语言-软件设计(二十一)

    数据结构与算法 二十 快速排序 堆排序 四 https blog csdn net ke1ying article details 129269655 这篇主要讲的是 编译与解释 文法 正规式 有限自动机 表达式 传值与传址 多种程序语言特
  • Taylor公式和插值多项式

    Taylor公式和插值多项式 笔记总结自 复旦大学 陈纪修 数学分析 课程 第5章第3节 Taylor公式和插值多项式 文章目录 Taylor公式和插值多项式 一 Taylor公式 带Peano余项的Taylor公式 带Lagrange余项
  • java代码实现分页_Java分页实现(示例代码)

    首先我们要清楚java分页的思路 第一我们要明白前端页面需要向java后台传递当前页码数以及每页显示多少条数据 第二java后台代码需要向前端页面传递每页显示的数据 以及总条数以及总页数 代码如下 首先我们要创建一个分页类用来存储数据 pu
  • 汇编——寄存器的分类和功能

    在汇编中 个人感觉最重要的部分其实就是寄存器了 这次我们了解一下寄存器的分类和功能 先说一下寄存器是什么吧 其实就是一部分的空间 我们可以使用这些空间来存储内容 寄存器的空间都是16位的 80x86中 后来有增长 也就是1个字的空间 堆栈则
  • Google Earth Engine(GEE) 03-矢量数据类型

    Google Earth Engine GEE 03 矢量数据类型 GEE基本语法 Geometry Dictionary Feature和FeatureCollection之间的关系 Dictionary Feature 常用函数 Fea
  • day--03springmvc

    回顾 1 响应 页面跳转 controller方法的字符串返回值 使用Model对象进行数据共享 默认是存储在request域对象中 使用ModelAndView对象 直接响应数据 controller方法返回的是普通字符串 control
  • 记录ncnn导出模型的权重读取的一点思路

    ncnn的 param和 bin文件的读取 参考这个基本上可以触类旁通 前言 大概找了找全网使用ncnn框架导出权重模型的博客 可以参考的只有2篇 一篇过时了 没法儿使用 另一篇的函数重载似乎提及了也没什么用处 因为另一篇提到的函数重载事实
  • 旧电脑 存储服务器 系统,爷爷级PC,用白菜价内存搭建内存硬盘操作系统,老系统飞起来。...

    认识众多玩家高手 拆客 DIY爱好者 查阅更多资源 一起学习技术知识 您需要 登录 才可以下载或查看 没有帐号 立即注册 x 爷爷级PC 用白菜价内存搭建内存硬盘操作系统 老系统飞起来 系统配置 内存硬盘1 png 55 33 KB 下载次
  • nodejs:webstrom调试及使用nodemon

    参考 webstrom调试及使用nodemon 提示 如果项目有nodemon json 参数类似上图 运行时可能会提示 ts node不是内部或外部命令 也不是可运行的程序 这时候需要 npm i g ts node
  • 错误隐藏学习手记(二)

    错误隐藏技术是在H 264在解码端后端的一种技术 用于恢复某一丢失帧或者宏块 一般来说每个宏块是16 16 Step1 我们怎么知道是哪一块宏块丢失了呢 这就和视频编解码H 264有些关系了 JM86中丢失块的确定取决于编码端灵活宏块重排模
  • 巴比特

    摘要 近日 据路透社报道 三位知情人士称 腾讯控股正在与脸书母公司Meta Platforms Inc Nasdaq META 就在中国销售Meta Quest系列虚拟现实头显进行谈判 路透社援引消息人士称 腾讯与Meta之间的谈判从去年开
  • 规范国内省份名称【Java】

    规范省份名称 param ipAddr 要规范的省份名称 return String public static String addressJiaoyan String ipAddr 4个直辖市 String zxs 北京 天津 上海 重
  • 华为OD题目: 查找充电设备组合

    查找充电设备组合 题目描述 某个充电站 可提供 n 个充电设备 每个充电设备均有对应的输出功率 任意个充电设备组合的输出功率总和 均构成功率集合 P 的 1 个元素 功率集合 P 的最优元素 表示最接近充电站最大输出功率 p max 的元素
  • Redis 主从配置

    环境说明 Docker Ubuntu CentOS Redis v4 0 10 redis conf redis conf是Redis的核心配置文件 默认docker运行的redis是不存在配置文件的 这里可以先从官网下载 wget htt
  • 人工智能结构图

    人工智能结构图
  • PNP的学习-EPNP

    EPNP主要是利用已知的3d点 通过PCA选择4个控制点 建立新的局部坐标系 从而将3d坐标用新的控制点表示出来 然后 利用相机投影模型和2d点 转换到相机坐标系中 再在相机坐标系中建立和世界坐标系同样关系 每个点在相机坐标系和世界坐标系下
  • Composer 杂记

    帐号管理 config composer auth json Composer install 文件下载失败 重试好几次都失败 删除掉composer lock文件 重新 composer install 成功 使用国内的源 compose
  • [代码调试]SPHP代码调试误入的坑

    SPHP论文下载链接 今天在找SPHP论文的代码时 发现谷歌上有一位兄弟上传了 说是作者上传的源码 以为很快就可以将论文中的结果复现出来 却没想到折腾了一晚上毫无进展 下面我把我的错误经验分享给大家 SPHP代码下载链接 当我们下载完这个代
  • 编程实战(3)——python绘制极坐标雷达图

    编程实战 3 python绘制极坐标雷达图 文章目录 编程实战 3 python绘制极坐标雷达图 综述 绘图代码和解析 绘制一张多主体雷达图 预处理 封闭雷达图 绘制图像 绘制多张单主体雷达图 建立子图 循环遍历画每个子图 综述 pytho