100天精通Python(可视化篇)——第87天:matplotlib绘制不同种类炫酷雷达图参数说明+代码实战(普通、堆叠、多个、矩阵、极坐标雷达图)

news2024/11/24 9:37:05

文章目录

  • 专栏导读
  • 1. 雷达图
    • 1)介绍
    • 2)参数说明
  • 2. 基本雷达图
  • 3. 堆叠雷达图
  • 4. 六边形战士
  • 5. 多个雷达图
  • 6. 雷达图矩阵
  • 7. 极坐标雷达图

专栏导读

🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

1. 雷达图

1)介绍

雷达图(Radar Chart)又称作径向图、多变量图或极坐标图,是表示多维度数据的一种形象化的数据图标,通常由集中的一个中心发出多条等长的连线,沿着指定的方向延伸出等值的点。

在这里插入图片描述

特点

  • 雷达图的优点是可以从多角度、多变量来研究和分析构成因素、数据结构;
  • 雷达图比较适用于对对象某一数据方面在各个维度之间存在关系情况下的表示;
  • 雷达图还可以表示多组数据之间的对比;

应用场景

  • 雷达图更适用于表示一组数据中不同类别或特征之间存在相互关联性;
  • 能够很好的表达多个数据之间关系;
  • 适用于分析数据对比,比如多人职业行为的对比,多个公司的工作效率的对比,用来把多个变量的数据比较起来。

2)参数说明

plt.polar函数是matplotlib中用于绘制极坐标图的函数,可以用于绘制雷达图:

def polar(*args, **kwargs):
    """
    Make a polar plot.

    call signature::

      polar(theta, r, **kwargs)

    Multiple *theta*, *r* arguments are supported, with format strings, as in
    `plot`.
    """
    # If an axis already exists, check if it has a polar projection
    if gcf().get_axes():
        ax = gca()
        if not isinstance(ax, PolarAxes):
            _api.warn_external('Trying to create polar plot on an Axes '
                               'that does not have a polar projection.')
    else:
        ax = axes(projection="polar")
    return ax.plot(*args, **kwargs)

参数大全及其说明:

  1. theta:极坐标系中的角度,以弧度表示。
  2. r:极坐标系中的半径,表示数据的大小。
  3. c:数据点的颜色。
  4. linewidth:数据点的线宽。
  5. linestyle:数据点的线型。
  6. marker:数据点的标记类型。
  7. alpha:数据点的透明度。
  8. label:数据点的标签,用于添加图例。
  9. **kwargs:其他参数。

其中,theta和r是必须的参数,其他参数都是可选的。你可以根据自己的需要选择适当的参数,以创建自己的雷达图。

2. 基本雷达图

案例1:

import matplotlib.pyplot as plt
import numpy as np

# 定义属性和属性值
properties = ['输出','KDA','发育','团战','生存']
values = [40,91,44,90,95,40]

# 生成角度
theta = np.linspace(0,2*np.pi,6)

# 绘制雷达图
plt.polar(theta,values)  # 绘制折线图
plt.fill(theta,values)   # 填充多边形区域

# 显示图形
plt.show()

代码说明

导入matplotlib.pyplot和numpy库。

定义属性和属性值,properties为变量名称,values为对应的数值。

生成角度,使用numpy库中的np.linspace函数生成从0到2π的等分角度,6表示等分的份数。

绘制雷达图,使用plt.polar函数绘制折线图,使用plt.fill函数填充多边形区域。

显示图形,使用plt.show函数显示图形。

运行结果:
在这里插入图片描述

案例2:

# 导入第三方模块
import numpy as np
import matplotlib.pyplot as plt

# 设置中文为雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']

# 构造数据
values = np.array([3.2,2.1,3.5,2.8,3])
feature = np.array(['个人能力','QC知识','解决问题能力','服务质量意识','团队精神'])
N = len(values)

# 设置雷达图的角度,用于平分切开一个圆面
angles=np.linspace(0,2*np.pi,N, endpoint=False)

# 将折线图形进行封闭操作
values = np.concatenate((values, [values[0]]))
angles = np.concatenate((angles, [angles[0]]))
feature=np.concatenate((feature,[feature[0]]))

# 创建图形
fig=plt.figure(figsize=(10,6),dpi=80)

# 这里一定要设置为极坐标格式
ax = fig.add_subplot(111, polar=True)

# 绘制折线图
ax.plot(angles, values, 'o-', linewidth=2)

# 填充颜色
ax.fill(angles, values, alpha=0.25)

# 添加每个特征的标签
ax.set_thetagrids(angles*180/np.pi, feature)

# 设置雷达图的范围
ax.set_ylim(0,5)

# 添加标题
plt.title('活动前后员工状态表现')

# 添加网格线
ax.grid(True)

# 显示图形
plt.show()

运行结果
在这里插入图片描述

3. 堆叠雷达图

将多个数据集叠加在一起,用于比较多个对象在多个变量上的表现。

# 导入第三方模块
import numpy as np
import matplotlib.pyplot as plt

# 设置中文 雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']

# 构造数据
values = [3.2,2.1,3.5,2.8,3]
values2 = [4,4.1,4.5,4,4.1]
feature = ['个人能力','QC知识','解决问题能力','服务质量意识','团队精神']

N = len(values)

# 设置雷达图的角度,用于平分切开一个圆面
angles=np.linspace(0, 2*np.pi, N, endpoint=False)

# 将雷达图中的折线图封闭
values=np.concatenate((values,[values[0]]))
values2=np.concatenate((values2,[values2[0]]))
angles=np.concatenate((angles,[angles[0]]))
feature=np.concatenate((feature,[feature[0]]))

# 绘图
fig=plt.figure(figsize=(20,8),dpi=80)
ax = fig.add_subplot(111, polar=True)

# 绘制折线图
ax.plot(angles, values, 'o-', linewidth=2, label = '活动前')

# 填充颜色
ax.fill(angles, values, alpha=0.25)

# 绘制第二条折线图
ax.plot(angles, values2, 'o-', linewidth=2, label = '活动后')
ax.fill(angles, values2, alpha=0.25)

# 添加每个特征的标签
ax.set_thetagrids(angles*180/np.pi, feature)

# 设置雷达图的范围
ax.set_ylim(0,5)

# 添加标题
plt.title('活动前后员工状态表现')

# 添加网格线
ax.grid(True)

# 设置图例
plt.legend(loc = 'best')

# 显示图形
plt.show()

该代码实现了一个雷达图,用于比较活动前后员工的状态表现。具体实现步骤如下:

导入需要的第三方模块numpy和matplotlib.pyplot。

设置中文字体为“SimHei”。

构造数据:values表示活动前员工的状态表现,values2表示活动后员工的状态表现,feature表示不同的特征(个人能力、QC知识、解决问题能力、服务质量意识、团队精神)。

设置雷达图的角度,用于平分切开一个圆面。

将雷达图中的折线图封闭,使其形成一个多边形。

绘制折线图和填充颜色,表示活动前和活动后员工的状态表现。

添加每个特征的标签,使其能够在雷达图上显示。

设置雷达图的范围,使其能够适配不同的数据。

添加标题,使其能够表达图表的主要意图。

添加网格线,使其能够更好地展示数据。

设置图例,使其能够说明不同的折线图代表的含义。

显示图形,使其能够在屏幕上显示。

运行结果

在这里插入图片描述

4. 六边形战士

六个堆叠雷达图:

import matplotlib
import matplotlib.pyplot as plt 
import numpy as np

#为了正确显示中文字体,将字体更改为黑体‘SimHei’
matplotlib.rcParams['font.family']='SimHei'           
matplotlib.rcParams['font.sans-serif']=['SimHei'] 

data_labels=np.array(['工程师','实验员','艺术家','推销员','社会工作者','记事员'])
n=6
radar_labels=np.array(['    研究型(I)','艺术型(A)','社会型(S)',\
                     '企业型(E)   ','常规型(C)','现实型(R)'])    #  为了美观加了几个空格

# 6种职业数据,列表元素为列表
data=np.array([[0.40,0.32,0.35,0.30,0.30,0.88],         
              [0.85,0.35,0.30,0.40,0.40,0.30],
              [0.43,0.89,0.30,0.28,0.22,0.30],
              [0.30,0.25,0.48,0.85,0.45,0.40],
              [0.20,0.38,0.87,0.45,0.32,0.28],
              [0.34,0.31,0.38,0.40,0.92,0.28]]) 

# 将360度平均分为n个部分(有endpoint=False分为6个部分,反之5个部分)
angles=np.linspace(0,2*np.pi,n,endpoint=False)       
data=np.concatenate((data,[data[0]]))          
angles=np.concatenate((angles,[angles[0]]))    

# 绘制全局绘图区域
plt.figure(facecolor='white') 

# 绘制一个11列极坐标系子图,当前位置为1
plt.subplot(111,polar=True)    

# 放置标题 ,ha是horizontalalignment(水平对齐方式)的缩写
plt.figtext(0.52,0.95,'霍兰德人格分析',ha='center',size=20)   

# 连线,画出不规则六边形
plt.plot(angles,data,'o-',linewidth=1.5,alpha=0.2) 

# 填充,alpha是透明度(自己的实践理解)
plt.fill(angles,data,alpha=0.25)   

# 放置图注(右上角)
legend=plt.legend(data_labels,loc=(0.94,0.80),labelspacing=0.1)    
plt.setp(legend.get_texts(),fontsize='small')    

# 打开坐标网格
plt.grid(True) 

# 显示
plt.show()       

运行结果:
在这里插入图片描述

5. 多个雷达图

将多个雷达图放在同一张图中,用于比较多个对象的表现:

# 导入第三方模块
import numpy as np
import matplotlib.pyplot as plt

# 设置中文 雅黑
plt.rcParams['font.sans-serif'] = ['SimHei']

# 构造数据
values = [3.2,2.1,3.5,2.8,3]
values2 = [4,4.1,4.5,4,4.1]
feature = ['个人能力','QC知识','解决问题能力','服务质量意识','团队精神']

N = len(values)

# 设置雷达图的角度,用于平分切开一个圆面
angles=np.linspace(0, 2*np.pi, N, endpoint=False)

# 将雷达图中的折线图封闭
values=np.concatenate((values,[values[0]]))
values2=np.concatenate((values2,[values2[0]]))
angles=np.concatenate((angles,[angles[0]]))
feature=np.concatenate((feature,[feature[0]]))

# 设置子图的排列方式
fig, axs = plt.subplots(2, 2, figsize=(20, 16), subplot_kw=dict(projection='polar'))

# 绘制子图1
axs[0, 0].plot(angles, values, 'o-', linewidth=2, label = '活动前')
axs[0, 0].fill(angles, values, alpha=0.25)
axs[0, 0].set_thetagrids(angles*180/np.pi, feature)
axs[0, 0].set_ylim(0,5)
axs[0, 0].set_title('子图1:活动前状态表现')
axs[0, 0].grid(True)
axs[0, 0].legend(loc = 'best')

# 绘制子图2
axs[0, 1].plot(angles, values2, 'o-', linewidth=2, label = '活动后')
axs[0, 1].fill(angles, values2, alpha=0.25)
axs[0, 1].set_thetagrids(angles*180/np.pi, feature)
axs[0, 1].set_ylim(0,5)
axs[0, 1].set_title('子图2:活动后状态表现')
axs[0, 1].grid(True)
axs[0, 1].legend(loc = 'best')

# 绘制子图3
axs[1, 0].plot(angles, values, 'o-', linewidth=2, label = '活动前')
axs[1, 0].fill(angles, values, alpha=0.25)
axs[1, 0].set_thetagrids(angles*180/np.pi, feature)
axs[1, 0].set_ylim(0,5)
axs[1, 0].set_title('子图3:活动前状态表现')
axs[1, 0].grid(True)
axs[1, 0].legend(loc = 'best')

# 绘制子图4
axs[1, 1].plot(angles, values2, 'o-', linewidth=2, label = '活动后')
axs[1, 1].fill(angles, values2, alpha=0.25)
axs[1, 1].set_thetagrids(angles*180/np.pi, feature)
axs[1, 1].set_ylim(0,5)
axs[1, 1].set_title('子图4:活动后状态表现')
axs[1, 1].grid(True)
axs[1, 1].legend(loc = 'best')

# 添加总标题
plt.suptitle('活动前后员工状态表现')

# 显示图形
plt.show()

运行结果:
在这里插入图片描述

6. 雷达图矩阵

将多个雷达图组成一个矩阵,用于比较多个对象在多个变量上的表现,并可同时比较多个数据集:

import numpy as np
import matplotlib.pyplot as plt

# 数据
data = np.array([
    [0.6, 0.8, 0.2, 0.4],
    [0.9, 0.2, 0.7, 0.3],
    [0.3, 0.6, 0.5, 0.8],
    [0.8, 0.4, 0.6, 0.1],
    [0.4, 0.7, 0.3, 0.6]
])

# 标签
labels = ['A', 'B', 'C', 'D']

# 角度
angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False)

# 添加第一个子图
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, [1]*len(angles), 'k--', linewidth=1)  # 画出六边形
ax.set_thetagrids(angles * 180/np.pi, labels)  # 设置极坐标轴的刻度和标签
ax.set_ylim(0, 1.2)  # 设置极坐标轴的极值范围

# 循环添加子图
for i in range(len(data)):
    ax = fig.add_subplot(3, 2, i+2, polar=True)  # 添加子图
    ax.plot(angles, data[i], 'o-', linewidth=2)  # 画出数据点
    ax.fill(angles, data[i], alpha=0.25)  # 填充数据点和中心点之间的区域
    ax.set_thetagrids(angles * 180/np.pi, labels)  # 设置极坐标轴的刻度和标签
    ax.set_ylim(0, 1.2)  # 设置极坐标轴的极值范围
    ax.set_title('Sample {}'.format(i+1))  # 设置子图标题

plt.tight_layout()  # 调整子图的布局
plt.show()  # 显示图形

代码说明

代码中的data数组存储了每个样本的数据,每一行代表一个样本,每一列代表一种特征。labels数组存储了每个特征的名称。angles数组则是每个特征所对应的角度,用来绘制雷达图的六边形。

首先,使用fig.add_subplot()方法添加第一个子图,用于画出雷达图的六边形,然后设置极坐标轴的刻度和标签,以及极值范围。

接着,循环添加子图,每个子图代表一个样本的雷达图。在每个子图中,使用ax.plot()方法画出数据点,并使用ax.fill()方法填充数据点和中心点之间的区域。然后同样设置极坐标轴的刻度和标签,以及极值范围,并设置子图标题。

最后,使用plt.tight_layout()方法调整子图的布局,以及plt.show()方法显示图形。

运行结果
在这里插入图片描述

7. 极坐标雷达图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 极轴图
plt.figure(figsize=(8,4))
ax1= plt.subplot(111, projection='polar')
ax1.set_title('spot fish')  # 创建标题
ax1.set_rlim(0,12)
 
data = np.random.randint(1,10,10)
theta=np.arange(0,2*np.pi,2*np.pi/10)
 
bar = ax1.bar(theta,data,alpha=0.5)
for r,bar in zip(data, bar):
    bar.set_facecolor(plt.cm.jet(r/10.))  # 设置颜色


plt.show()  # 显示图形

代码说明

导入需要的库:numpy、matplotlib.pyplot、Axes3D(3D图需要)

创建一个极轴图:plt.subplot(111, projection='polar')

设置图形标题:ax1.set_title('spot fish')

设置极轴范围:ax1.set_rlim(0,12)

生成随机数据:data = np.random.randint(1,10,10)

生成极角数据:theta=np.arange(0,2np.pi,2np.pi/10)

绘制柱状图:bar = ax1.bar(theta,data,alpha=0.5)

设置颜色:bar.set_facecolor(plt.cm.jet(r/10.))

显示图形:plt.show()

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526658.html

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

相关文章

做一名活动策划是什么体验

在一些不了解的人眼中,活动策划就是那种外表光鲜亮丽,气场十足,眼神犀利,跷着二郎腿,情绪饱满的完成一场又一场的完美的秀。 好像确实是这样,但是你们又知不知道这背后的一切我们活动策划到底付出了什么&a…

SpringMVC的三大功能

目录 一、初识SpringMVC 1.1 MVC的定义 1.2 MVC和SpringMVC的关系是什么? 1.3 SpringMVC的重要性 二、Spring MVC的三大功能 2.1 连接功能 2.1.1 RequestMapping 注解介绍 2.1.2 GetMapping 和 PostMapping 2.2 获取参数功能 2.2.1 传递普通参数 2.2.2 传递对象 2…

【K8s】Ingress的使用

文章目录 一、Ingress介绍1、Ingress的作用2、Ingress工作流程 二、Ingress使用1、测试数据准备2、HTTP代理3、HTTPS代理 一、Ingress介绍 1、Ingress的作用 上一章中,NotePort和LoadBalancer类型的Service可给集群外部机器提供访问,但这两种类型都有缺…

JavaScript数组

1.数组是什么 2.数组的基本使用 3.操作数组 4.数组案例 一、数组是什么? 1.数组(Array)是一种可以按顺序保存数据的数据类型2.为什么要使用数组?例如:如果想保存一个班所有同学的姓名怎么办?场景:如果有多个数据可以用…

vue3中ts定义对象,pinia中使用ts定义状态对象

文章目录 引入reactive中使用数组reactive中定义对象类型pinia中定义状态对象 引入 用惯了js,突然使用ts属实有点不习惯,这里介绍一下自己在vue3中使用ts初始化内容的一些小技巧 reactive中使用数组 例如下面所示的代码,我们就像写js代码一…

数组a与数组b作内积:即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 数组a与数组b作内积: 即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b) [太阳]选择题 请问关于以下代码的输出结果是? import numpy as np …

招银网络科技-2024届暑期实习-Java后端开发

目录 1.SpringBoot 中的 SpringBootApplication注解的作用是什么?2.SpringBoot 中你们是如何加载配置信息的?3.RabbitMQ 如何保证消息不丢失?4.如果消费者这边消费到一半宕机了怎么办?5.RabbitMQ 如何保证消息没有被重复消费&…

C语言函数大全-- w 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcsdup 1.1 函数说明 函数声明函数功能wchar_t *wcsdup(const wchar_t *str);用于复制宽字符字符串 参数: str : 待复制的宽字符串 返回值: 如果成功复制,则返回指向该…

跨域解决方案

同源策略 同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。 所谓的同源是指【协议域名端口】三者相同,即便两个不同的域名,指向同一个IP地址&#xf…

手把手教你下载darknet_ros

前两天下载darknet_ros,好怪啊,是我太菜了,根本看不懂这都啥啊,所以记录一下 首先附上链接 这里是github上的代码:https://github.com/leggedrobotics/darknet_ros 这里是gitcode上的代码:https://gitcode…

软件技术体系汇总-Spring篇

Spring源码学习总结 版本说明 系列文章是本人在学习 Spring 源码的过程中总结 Spring 版本:5.2.8.RELEASE 调试工具:IDEA2020.3 作者:虎哥 常见面试题 1. 什么是 Spring Framework ? 官方文档: Spring makes it eas…

U-Mail邮件中继完美解决邮件超大附件发送难题

随着企业数字化转型的逐步深入,电子邮件成为了企业内部或与外部业务沟通交流的重要方式之一。但是我们在发送电子邮件的时候,如果邮件中包含工程设计图纸,视频文件、产品设计方案等超大附件,发送的邮件会被对方邮件服务器拒收&…

[架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

目录 引言: 第1章 故障树分析法与鱼骨图的比较 1.1 相同点 1.2 区别点 第2章 鱼骨图 第3章 故障树 3.1 示意图 3.2 故障树解读 3.3 故障树常见符号 第4章 产品失效(Failure)模式分析DFMEA 引言: 目标系统/产品的可靠性和性能在客户需求阶段就…

从浏览器输入域名开始分析 DNS 解析过程

摘要:DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。 本文分享自华为云社区《DNS 那些事 —— 从浏览器输入域名开始分析 DNS 解析过程》&#x…

基于SSM的大学生就业信息管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

常见指令以及权限理解(Linux)

常见指令以及权限理解 命令格式: command [-options] parameter1 parameter1 命令 选项 参数1 参数2 1.command为命令名称,例如变化目录的cd等 2.中括号[ ]实际在命令中是不存在的,这个中括号代表可选,通常选项前面会添加一个符号…

【数据科学赛】HackAPrompt 挑战语言模型!

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 更多比赛信息见 CompHub主页[1] 以下信息由AI辅助创作,仅供参考,请以官网为准(文末…

激活函数Relu对精度和损失的影响研究

1 问题 在学习深度学习的过程中,欲探究激活函数Relu对精度和损失的影响。 2 方法 测试设置激活函数时和没有设置激活函数时网络的性能。 控制其余变量: Beach_size128optimizer torch.optim.SGD网络为三层全连接网络(784->512->10&…

systemctl针对service类型的配置文件

文章目录 systemctl针对service类型的配置文件systemctl配置文件相关目录简介systemctl配置文件的设置项目简介两个vsftpd运行的实例多重的重复设置方式:以getty为例将tty数量由6个降低为4个暂时新增vsftpd到1212端口 自己做个服务 systemctl针对service类型的配置文…

事件循环Event Loop

什么是事件循环(event loop) 主线程不断的从消息队列中获取消息,执行消息,这个过程被称为事件循环,在javaScript中就是采用事件循环来解决单线程带来的问题 线程和进程 进程:计算机已经运行的程序&#…