数据可视化:用雷达图进行对比分析
大数据DT
共 3368字,需浏览 7分钟
· 2020-07-10
导读:雷达图的背景一圈一圈像雷达,用多边形来展现数据的大小,我认为比较适合用于有多种不同维度的情形,是发现差距的一种好工具。
作者 / 来源:林骥(ID:linjiwx)
01
比如说,「得到 APP」上的学分构成包括 5 个不同维度,我根据自己的学分构成及其变化,制作了一张雷达图。
其中「持续性」与学习的天数相关,「学习量」与听课或看书的数量相关,「笔记」与笔记的数量和互动相关,「知识分享」与分享转发的次数相关,「好奇心」与搜索的次数和广度相关。
从图中可以看出,在 2020 年的年初,我在笔记方面还比较薄弱,经过努力,我做笔记的数量明显增加了。
借助雷达图,我们可以直观地看到差距,进而通过分析,更好地进行改善。
02
接下来,我们看看用 Matplotlib 画图的具体步骤。
首先,导入所需的库,并设置中文字体和定义颜色等。
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x)
# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
'灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
'橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
其次,从 Excel 文件中读取数据,并定义画图用的数据。
# 数据源路径
filepath='./data/林骥的学分构成.xlsx'
# 读取 Excel文件
df = pd.read_excel(filepath)
# 提取画图所需的数据
data0 = df.iloc[0, 2:].values
data1 = df.iloc[1, 2:].values
#提取标签
label = np.array(df.iloc[1, 2:].index)
# 根据分数添加评级的标签
for i, d in enumerate(data1):
if d > 4:
grade = 'A^+'
elif d == 4:
grade = 'A'
elif d > 3:
grade = 'B^+'
elif d == 3:
grade = 'B'
else:
grade = 'B^-'
label[i] += '\n' + r'$\bf{' + grade + '}$'
# data 有几个数据,就把整圆 360° 分成几份
angle = np.linspace(0, 2*np.pi, len(data0), endpoint=False)
# 增加第一个 angle 到所有 angle 里,以实现闭合
angles = np.concatenate((angle, [angle[0]]))
# 倒转顺序,以让雷达图顺时针显示
angles = angles[::-1]
#增加第一个 data 到所有的 data 里,以实现闭合
data0 = np.concatenate((data0, [data0[0]]))
data1 = np.concatenate((data1, [data1[0]]))
接下来,开始用「面向对象」的方法进行画图。
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')
# 设置标题
ax.set_title('\n林骥的学分构成及其变化\n\n', fontsize=26, loc='left', color=c['深灰色'])
# 设置网格标签
ax.set_thetagrids(angles*180/np.pi, labels=label)
# 画雷达图,用顺时针显示
ax.plot(angles, data0, 'o-', label=df.iloc[0, 0].strftime('%Y-%m-%d'))
ax.plot(angles, data1, 'o-', label=df.iloc[1, 0].strftime('%Y-%m-%d'))
# 设置极坐标 0° 的位置
ax.set_theta_zero_location('N')
# 设置显示的极径范围
ax.set_rlim(0, 5)
# 填充颜色
ax.fill(angles, data0, facecolor=c['浅蓝色'], alpha=0.6)
ax.fill(angles, data1, facecolor=c['浅橙色'], alpha=0.6)
# 设置极径标签,放在第一象限的中间位置
ax.set_rlabel_position(360-360/len(data0)/2)
# 设置图例显示的位置
l = ax.legend(ncol=2, loc='lower center', frameon=False, borderaxespad=-3, fontsize=13)
for text in l.get_texts():
text.set_color(c['深灰色'])
# text.set_size(13)
# 去掉最外围的黑圈
ax.spines['polar'].set_visible(False)
# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=c['深灰色'])
plt.show()
下载画图用的数据和完整代码,你可以前往:https://github.com/linjiwx/mp
03
雷达在展现多个维度的得分或性能方面,效果不错,在财务分析和标杆管理中有着广泛的应用。
另外,在一些游戏中,也有用雷达图来展现人物的能力。
但是,雷达图也有一些自身的缺点,包括:
- 如果在一个雷达图中展现超过 2 组数据,会让图表难以阅读。
- 变量的个数不宜过多,否则密密麻麻的线条可能让人抓不到重点。
- 从表达数据的精确度来看,极坐标中的角度,不如直角坐标中的位置。
同样的数据,不同人得出的观点可能不一样,图表的选择可能也不一样,我们通常需要考虑以下几个因素:
- 分析提炼的信息;
- 所属数据的类型;
- 想要表达的观点;
- 想要强调的信息。
很多人作图有一种误区,就是喜欢运用所谓的技巧和创新,做出让人难以看懂的复杂图表,这与图表的目的背道而驰,是我们应该避免的。
划重点?
干货直达?
更多精彩?
在公众号对话框输入以下关键词查看更多优质内容!
PPT | 读书 | 书单 | 硬核 | 干货 | 讲明白大数据 | 云计算 | 数据库 | Python | 可视化 | 神操作AI | 人工智能 | 机器学习 | 深度学习 | 神经网络5G | 中台 | 用户画像 | 1024 | 大神 | 数学 | 揭秘
据统计,99%的大咖都完成了这个神操作?
评论
英伟达Blackwell平台网络配置分析
本文来自“英伟达Blachwell平台网络配置详解”。GTC大会英伟达展示了全新的 Blackwell 平台系列产品,包括 HGX B100 服务器、NVLINK Switch、GB200Superchip Computer Node、Quantum X800 交换机和 CX8 网卡(InfiniB
架构师技术联盟
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
来源:blog.csdn.net/shark_chili3007/article/details/123366179👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目
小哈学Java
0
管理世界2024 | 使用管理层讨论与分析测量「企业人工智能指标」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址 https://textdata.cn/blog/2024-04-19-ai-improve-firm-productivity/
大邓和他的Python
0
JavaScript 可视化:Promise执行彻底搞懂
深入探讨了 JavaScript 中 Promise 的内部机制,解释了它们如何使异步任务以非阻塞方式执行,并展示了 Promise 的创建、状态变化以及与事件循环的关系。正文从这开始~~JavaScript 中的 Promise 一开始可能会让人感到有些难以理解,但是如果我们能够理解其内部的工作原
高级前端进阶
0
推荐 | 文本分析库cntext2.x使用手册
Tips: 公众号推送后内容只能更改一次,且只能改20字符。 如果内容出问题,或者想更新内容, 只能重复推送。 为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2024-04-27-cntext2x-usage-tutorial/cntext是大邓
大邓和他的Python
1
强烈推荐一款好用到爆的可视化拖拽库
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群今天给大家推荐这款拖拽组件VueDraggablePlus,试了一下非常不错,据说还被尤雨溪推荐过,咱们国人自己开发的,中国人不骗🇨🇳人,我就再来推
程序员成长指北
2
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2