如何利用Python matplotlib绘制雷达图


Posted in Python onDecember 21, 2020

本篇文章介绍使用matplotlib绘制雷达图。

雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形。雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多。

一、matplotlib绘制圆形雷达图

# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"大学英语": 87, "高等数学": 79, "体育": 95, "计算机基础": 92, "程序设计": 85},
   {"大学英语": 80, "高等数学": 90, "体育": 91, "计算机基础": 85, "程序设计": 88}]
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_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
# 设置图形的大小
fig = plt.figure(figsize=(8, 6), dpi=100)
# 新建一个子图
ax = plt.subplot(111, polar=True)
# 绘制雷达图
ax.plot(angles, score_a, color='g')
ax.plot(angles, score_b, color='b')
# 设置雷达图中每一项的标签显示
ax.set_thetagrids(angles*180/np.pi, labels)
# 设置雷达图的0度起始位置
ax.set_theta_zero_location('N')
# 设置雷达图的坐标刻度范围
ax.set_rlim(0, 100)
# 设置雷达图的坐标值显示角度,相对于起始角度的偏移量
ax.set_rlabel_position(270)
ax.set_title("计算机专业大一(上)")
plt.legend(["弓长张", "口天吴"], loc='best')
plt.show()

运行结果:

如何利用Python matplotlib绘制雷达图

绘制雷达图需要先建立极坐标系,关于极坐标系可以自己了解一下。建立好极坐标后可以在极坐标中绘制折线图、柱状图等,大部分情况,都是用折线图,形成一个不规则的闭合多边形。本文中用某高校大一的期末考试成绩作为例子来演示雷达图的效果。

linspace(): 用于将极坐标根据数据的维度进行等分,第一个参数传入起始角度,第二参数传入结束角度,第三个参数传入分成多少等份。其他参数根据需要传入,如endpoint默认为True,最后一个数据处于结束的角度,根据本例中前面的参数0~2π,应该设置为False,否则最后一个数据与第一个数据角度重叠了。

concatenate(): 使雷达图的数据是环形封闭的,concatenate()函数的第一个参数是一个元组,元组中的每个元素是一个数组,concatenate()函数将这些数组连接到一起,组成一个新的数组。要让绘制的雷达图封闭,将数据的第一个值连接到数据的结尾即可。

本文用折线图plot()来绘制雷达图,使用figure()函数设置好图形的大小和清晰度,然后使用subplot()函数来创建一张子图。subplot()函数的第一个参数传入长度为3的数字,第一个数字表示将画布分成几行,第二个数字表示将画布分成几列,第三个数字表示当前的子图处于哪个位置(按从左至右、从上到下的顺序排序),第三个数字不能超出前两个数字切分的子图数范围。如111表示将画布分成一行一列(只有一张子图),当前的子图处于第一张子图中。在subplot()函数中,将polar参数设置True,得到的图形才是极坐标。

极坐标系设置完成后,使用子图对象ax调用折线图函数plot(),即可绘出雷达图。如果有多组数据,多次调用plot()函数即可。

使用set_thetagrids()函数设置雷达图中每个维度的标签和显示位置。使用set_theta_zero_location()函数设置雷达图的0度位置,可以传入"N"、"NW"、"W"、"SW"、"S"、"SE"、"E"、"NE"八个方位缩写。使用set_rlim()函数设置极坐标上的刻度范围。使用set_rlabel_position()函数设置极坐标上的刻度标签显示位置,传入一个相对于雷达图0度的角度值。当然还可以根据需要设置其他属性,如标题、图例等。

在上面的例子中,将两位同学的考试成绩绘制成了雷达图,通过雷达图,可以看出两个人的单科成绩互有高低,而整体来看,两位同学成绩都很优秀。上面的雷达图中,网格线都是圆形的,而用折线图连接的雷达图两个维度之间是直接连接的,所以将网格线换成多边形会更合理一点。

二、matplotlib绘制多边形雷达图

import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"大学英语": 87, "高等数学": 79, "体育": 95, "计算机基础": 92, "程序设计": 85},
   {"大学英语": 80, "高等数学": 90, "体育": 91, "计算机基础": 85, "程序设计": 88}]
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_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
fig = plt.figure(figsize=(10, 6), dpi=100)
fig.suptitle("计算机专业大一(上)")
ax1 = plt.subplot(121, polar=True)
ax2 = plt.subplot(122, polar=True)
ax, data, name = [ax1, ax2], [score_a, score_b], ["弓长张", "口天吴"]
for i in range(2):
 for j in np.arange(0, 100+20, 20):
  ax[i].plot(angles, 6*[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='b')
 # 隐藏最外圈的圆
 ax[i].spines['polar'].set_visible(False)
 # 隐藏圆形网格线
 ax[i].grid(False)
 for a, b in zip(angles, data[i]):
  ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=12, color='b')
 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])
plt.show()

运行结果:

如何利用Python matplotlib绘制雷达图

在极坐标系中,极径值相等的点在一个圆上,所以绘制的雷达图中,网格线默认都是圆形的。如果要绘制多边形的雷达图,则需要将圆形的网格线隐藏,然后根据刻度范围绘制出多边形的网格线。

首先使用plot()函数,根据刻度范围,绘制出同心的多个多边形和多个维度方向的极轴,作为雷达图的网格线,形成一张“网”。

链式调用极坐标的spines['polar'].set_visible()函数,传入参数False,将极坐标系最外圈的圆形隐藏。调用grid()函数,传入参数False,将极坐标系中的的圆形网格线隐藏。

修改完网格线后,即可达到多边形的效果。在第二次绘制雷达图时,将两位同学的成绩分到两张不同的雷达图中,并用text()设置了每个维度的数据标注,使用suptitle()函数来设置整张图形的标题。

上面的两次绘图,将两位同学的成绩绘制在同一张雷达图时,更方便对比两位同学的成绩,如比较谁更全面、更优秀。分开绘制时,更方便分析个人的成绩情况,如是否偏科。而相对于圆形的雷达图,在多边形的雷达图中,不会出现雷达图与网格线的不合理交叉(雷达图与网格线交叉两次),使用多边形网格线更合理。

到此这篇关于如何利用Python matplotlib绘制雷达图的文章就介绍到这了,更多相关Python matplotlib绘制雷达图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
kNN算法python实现和简单数字识别的方法
Nov 18 Python
Python实现的批量下载RFC文档
Mar 10 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
聊聊Python中的pypy
Jan 12 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
Python之列表实现栈的工作功能
Jan 28 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
Python使用scapy模块发包收包
May 07 Python
Python几种酷炫的进度条的方式
Apr 11 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 #Python
python opencv肤色检测的实现示例
Dec 21 #Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 #Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 #Python
python 录制系统声音的示例
Dec 21 #Python
用python发送微信消息
Dec 21 #Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 #Python
You might like
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
PHP基本语法实例总结
2016/09/09 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
基于jquery扩展漂亮的下拉框可以二次修改
2013/11/19 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
python函数的5种参数详解
2017/02/24 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python如何删除列为空的行
2020/07/17 Python
python pymysql库的常用操作
2020/10/16 Python
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
师范生求职自荐信
2014/06/14 职场文书
网络管理员岗位职责
2015/02/12 职场文书
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL