如何利用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 相关文章推荐
python 图片验证码代码
Dec 07 Python
python冒泡排序算法的实现代码
Nov 21 Python
python使用chardet判断字符串编码的方法
Mar 13 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
Python中实现最小二乘法思路及实现代码
Jan 04 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
python3爬虫怎样构建请求header
Dec 23 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
Python连接字符串过程详解
Jan 06 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python实现删除文件但保留指定文件
2015/06/21 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
医药类个人求职的自我评价
2014/02/12 职场文书
个人委托书范本
2014/09/13 职场文书
市场营销工作计划书
2014/09/15 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
初级职称评定工作总结
2015/08/13 职场文书
python - timeit 时间模块
2021/04/06 Python