我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用python绘制极坐标雷达图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用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]

封闭雷达图

由于我们画出来的图是一个封闭的多边形,而我们提取出来的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也很智能的提供了“角度-半径”的极坐标参数填写方式;

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

总结

到此这篇关于用python绘制极坐标雷达图的文章就介绍到这了,更多相关python坐标雷达图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用python绘制极坐标雷达图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Python绘制雷达图

假设某天某地每三个小时取样的气温为0时3时6时9时12时15时18时21时24时3℃5℃6℃3℃1℃3℃3℃2℃3℃针对温度变化趋势绘制雷达图:代码如下:import numpy as npimport matplotlib.pyplot
2023-01-31

PyQt5+QtChart实现绘制极坐标图

QChart是一个QGraphicScene中可以显示的QGraphicsWidget。本文将利用QtChart实现极坐标图的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-12-16

怎么使用python绘制雷达图

这篇文章主要介绍了怎么使用python绘制雷达图,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python有哪些常用库python常用的库:1.requesuts;2.scr
2023-06-14

Python怎么使用pyecharts绘制雷达图

本篇内容介绍了“Python怎么使用pyecharts绘制雷达图”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!雷达图雷达图是以从同一点开始的
2023-07-02

Matlab实现极坐标堆叠柱状图的绘制

极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图。本文将为大家提供Matlab绘制极坐标堆叠柱状图的示例代码,需要的可以参考一下
2022-11-13

Python绘制雷达图(俗称六芒星)

原文链接:https://blog.csdn.net/Just_youHG/article/details/83904618 背景《Python数据分析与挖掘实战》 案例2–航空公司客户价值分析在该案例中的雷达图缺少相应的代码,查看相关文档
2023-01-30

如何在Python中使用ECharts绘制雷达图

如何在Python中使用ECharts绘制雷达图摘要:雷达图是一种多维数据可视化图表,用于展示各个维度之间的关系和差异程度。本文将介绍使用Python中的ECharts库来绘制雷达图,并提供详细的代码示例。关键词:Python,EChart
如何在Python中使用ECharts绘制雷达图
2023-12-17

使用R语言怎么绘制双坐标图直方图

这期内容当中小编将会给大家带来有关使用R语言怎么绘制双坐标图直方图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代
2023-06-14

Python绘图实现坐标轴共享与复用详解

本指南详细介绍了在Python中使用Matplotlib库共享和复用坐标轴。涵盖了通过twinx()和twiny()函数实现坐标轴共享以及使用subplot()函数实现坐标轴复用的方法。示例演示了如何使用这些技术创建更复杂且有用的图表。还讨论了共享和复用坐标轴的优点和局限性。
Python绘图实现坐标轴共享与复用详解
2024-04-02

使用ECharts和Python接口生成极坐标图的方法

使用ECharts和Python接口生成极坐标图的方法,需要具体代码示例ECharts是一款非常强大、易于使用的开源数据可视化工具,它具有快速、美观、可定制的特点,可以快速地绘制各种图表。ECharts支持的图表类型非常多,包括柱状图、折线
使用ECharts和Python接口生成极坐标图的方法
2023-12-17

Python如何根据站点列表绘制站坐标全球分布图

本篇内容主要讲解“Python如何根据站点列表绘制站坐标全球分布图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何根据站点列表绘制站坐标全球分布图”吧!根据站点列表绘制站坐标全球分
2023-06-22

微信小程序开发中如何使用canvas绘制坐标图

这篇文章主要为大家展示了“微信小程序开发中如何使用canvas绘制坐标图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序开发中如何使用canvas绘制坐标图”这篇文章吧。1、线图func
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录