前言

  在成绩单与家庭账本这两张“最熟悉却最难读懂”的表格里,往往藏着比总分、总支出更有价值的故事:哪几门课让学霸的“雷达”出现尖刺?哪几个月份让水电费把家庭预算“拉成”不规则的多边形?传统表格只能罗列数字,却难以一眼看穿“偏科”或“消费黑洞”。Matplotlib 的雷达图正是破解这一痛点的钥匙——它把多维数据映射到极坐标,让每一科成绩、每一项开销都成为图形的棱角,相似与差异瞬间立体。


一、雷达图的定义

  雷达图是极坐标系图形,也称为戴布拉图、蜘蛛网图、极坐标图、网络图、星图、不规则多边形图或Kiviat图。雷达图可以直观地展现多维数据集,查看哪些变量具有相似的值、变量之间是否有异常值,适合用于查看哪些变量在数据集得分较高或较低,可以很好地展示性能和优势,以及展现某个数据集的多个关键特征,或者展现某个数据集的多 个关键特征和标准值的比对,一般适用于比较多组数据在多个维度上的取值。

二、雷达图实例

1.某高校学生8门专业核心课成绩分析,一眼识别“工科硬核度”

  很多学校的毕业证和学位证只能体现一种学习经历或者证明达到该学习阶段的最低要求,并不能体现学生的综合能力以及擅长的学科与领域,所以大部分单位在招聘时往往还需要借助于成绩单进行综合考察。但单独的表格式成绩单不是很直观,并且存在造假的可能。在证书上列出学生所有课程的成绩不太现实,可以考虑把每个学生的专业核心课成绩绘制成雷达图印在学位证书上,这样既可以让用人单位非常直观地了解学生的综合能力,核心课程和成绩绘制雷达图。

代码示例:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
# 某学生的课程与成绩
courses = ['C++', 'Python', '高数', '大学英语', '离散数学', '概率论与数理统计', '人工智能导论', 'python数据分析与可视化']
scores1 = [80, 95, 78, 85, 45, 65, 80, 60]
scores2 = [45, 77, 93, 60, 75, 90, 80, 90]
# 数据长度
dataLength = len(courses)
# angles数组把圆周等分为dataLength份
angles = np.linspace(0, 2 * np.pi, dataLength, endpoint=False)
# 闭合图形,将第一个数据添加到末尾
scores1 = np.concatenate((scores1, [scores1[0]]))
scores2 = np.concatenate((scores2, [scores2[0]]))
angles = np.concatenate((angles, [angles[0]]))
# 绘制雷达图
plt.polar(angles, scores1, 'r*--', linewidth=2, label='张三')
plt.fill(angles, scores1, facecolor='r', alpha=0.3)
plt.polar(angles, scores2, 'g^--', linewidth=2, label='李四')
plt.fill(angles, scores2, facecolor='g', alpha=0.3)
# 设置角度网格标签
plt.thetagrids(angles[:-1] * 180 / np.pi, courses)
# 设置图例位置
plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1.1))
# 显示图形
plt.show()

结果展示:

在这里插入图片描述

2.张三家庭12 个月开销分析,直观定位“钱包漏洞”。

  为了分析家庭开销的详细情况,也为了更好地进行家庭理财,张三对2022年每个月的蔬菜、水果、肉类、日用品、旅游、随礼等各项支出作出了详细记录,如下表所示。编写程序根据张三的家庭开销情况绘制雷达图。

类别1月2月3月4月5月6月7月8月9月10月11月12月
蔬菜14009801100137012501000110015509001100600600
水果900880900600600700650860580620400600
肉类480700370440500400360380488600600400
日用品110014001040130012001300100012009501000900950
衣服6503500030030030001400500800200000
旅游018000000000400000
随礼040000600010006001800800001000

代码示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 一年12个月每月支出数据
data = {
    '蔬菜': [1350, 1500, 1330, 1550, 900, 1400, 980, 1100, 1370, 1250, 1000, 1100],
    '水果': [400, 600, 580, 620, 700, 650, 860, 900, 880, 900, 600, 600],
    '肉类': [480, 700, 370, 440, 500, 400, 360, 380, 480, 600, 600, 400],
    '日用品': [1100, 1400, 1040, 1300, 1200, 1300, 1000, 1200, 950, 1000, 900, 950],
    '衣服': [650, 3500, 0, 300, 300, 3000, 1400, 500, 800, 2000, 0, 0],
    '旅游': [4000, 1800, 0, 0, 0, 0, 0, 4000, 0, 0, 0, 0],
    '随机': [0, 4000, 0, 600, 0, 1000, 600, 1800, 800, 0, 0, 1000]
}
datalength = len(data['蔬菜'])  # 数据长度
# angles 数组把圆周等分为 datalength 份
angles = np.linspace(0, 2 * np.pi, datalength, endpoint=False)
markers = ('*', 'v', '^', 'D', 'o')  # 散点符号
# 设置更小的图形尺寸
plt.figure(figsize=(8, 6))
for col in data.keys():
    # 使用随机颜色和标记符号,分别绘制极坐标折线图(不闭合)
    color = '#' + ''.join(map('{:02x}'.format, np.random.randint(0, 255, 3)))
    plt.polar(angles, data[col], color=color,
              marker=np.random.choice(markers), label=col, markersize=4, linewidth=1)
# 设置角度网格标签
plt.thetagrids(angles * 180 / np.pi, [f'{i}月' for i in range(1, 13)], fontsize=8)
# 尝试设置中文字体,如果找不到指定字体则使用默认字体
try:
    font = fm.FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')
    plt.legend(prop=font, loc='upper right', bbox_to_anchor=(1.3, 1.0), fontsize=8)
except:
    plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0), fontsize=8)
plt.title('月度支出分布', pad=15, fontsize=10)
plt.tight_layout()
plt.show()

结果展示:


总结

  本文通过两个典型场景——高校学生专业课程成绩与家庭月度支出结构——系统验证了雷达图在多变量对比分析中的直观性与高效性。借助 Matplotlib 的极坐标接口,仅需完成数据闭合、角度均分与视觉编码三步,即可将高维表格转化为低维可交互图形:
  实例1:雷达图一次性呈现多名学生在全部核心课程上的分布差异,尖峰与凹陷直接对应优势与短板,为个性化教学与招聘筛选提供可视化依据。
  实例2:以自然月为轴、支出类别为线的多系列雷达图,可迅速定位异常消费节点与季节性资金漏洞,辅助预算制定与成本控制。
  实验结果表明:在变量规模 ≤ 12 维、数据已归一化的前提下,雷达图对离群值、极值及结构差异的识别速度显著优于传统柱状或折线组合图。未来工作可进一步引入交互式填充、动态时间切片与标准分位线,提升图形的可解释性与决策支持能力。掌握该方法后,分析师可将“多维数据→雷达图”这一范式无缝迁移至绩效评估、产品功能对比、用户画像等更广泛的商业与科研场景。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐