如何用脚本批量生成数据雷达图?从零到自动化的完整指南

目录导读
- 为什么需要批量生成雷达图? – 场景与痛点
- 核心工具与环境准备 – Python + Matplotlib + Pandas
- 三步写脚本:读取数据、多子图布局、自动保存
- 常见问题问答 – 应对数据缺失、标签重叠、颜色统一
- 进阶技巧:定制化与动态更新
为什么需要批量生成雷达图?
在数据分析报告、竞品对比或性能评估中,雷达图(Radar Chart)能直观展示多个维度的优劣,但手动绘制数十张雷达图效率极低,且容易出错,一家电商公司需为200个SKU生成用户评分雷达图(含价格、质量、物流等5个维度),若逐个操作,耗时可能超过一周。
场景痛点:
- 数据源格式混乱(CSV、Excel、数据库)
- 每张图需要独立文件存储
- 标签、字体、颜色需全局统一
脚本化优势:
- 5分钟完成200张图生成
- 自动命名,避免人工错误
- 可复用,仅需更新数据
核心工具与环境准备
推荐工具栈:
- Python 3.8+:脚本基础环境
- Pandas:处理结构化数据
- Matplotlib:绘图核心库(自带雷达图功能)
- Numpy:辅助角度计算
安装命令(终端执行):
pip install pandas matplotlib numpy openpyxl
注:若数据在Excel中,需安装openpyxl
数据准备示例(CSV格式,每行一组数据):
| 姓名 | 维度_A | 维度_B | 维度_C | 维度_D | 维度_E |
|------|--------|--------|--------|--------|--------|
| 产品1| 4.2 | 3.8 | 5.0 | 2.1 | 4.5 |
| 产品2| 3.1 | 4.5 | 4.0 | 3.9 | 2.8 |
三步写脚本:读取数据、多子图布局、自动保存
步骤1:读取数据并转化为角度坐标
雷达图需要将每个维度的数值映射到等角度的圆周上。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取CSV(假设第1列为名称,其余为维度值)
df = pd.read_csv('data.csv')
categories = list(df.columns[1:]) # 维度名称
N = len(categories)
# 角度计算:每周平分360°
angles = [n / float(N) * 2 * np.pi for n in range(N)]
angles += angles[:1] # 闭合图形
步骤2:循环绘制并保存
利用Matplotlib的plt.subplots()创建圆形布局,每行数据绘制一张子图。
for index, row in df.iterrows():
values = row[1:].tolist() # 提取当前行的数值
values += values[:1] # 闭合
# 创建画布(可根据实际调整子图数量,此处逐张保存)
fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(polar=True))
# 绘制填充雷达图
ax.plot(angles, values, 'o-', linewidth=2, color='#2E86C1')
ax.fill(angles, values, alpha=0.25, color='#2E86C1')
# 设置角度刻度标签
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, fontsize=10)
# 设置标题与环形网格
ax.set_title(f"Radar Chart - {row[0]}", fontsize=14, pad=20)
ax.set_ylim(0, 5) # 假设数值范围0-5
# 保存为PNG,文件名用第一列标识
plt.tight_layout()
plt.savefig(f'output/radar_{row[0]}.png', dpi=200)
plt.close() # 关闭画布释放内存
关键点:
subplot_kw=dict(polar=True)创建极坐标轴- 每次循环关闭画布,避免内存溢出(尤其针对>100张图时)
步骤3:批量处理&自动命名
输出文件夹output/可提前创建,脚本会自动生成radar_产品1.png等文件。
常见问题问答
Q1:如果不同数据组的维度数量不一致怎么办?
A:脚本要求每行维度数必须相等,若数据缺失,建议用fillna(0)填充,或用平均值,否则雷达图角度会错位。
df = df.fillna(df.median()) # 用中位数填充空值
Q2:生成的雷达图标签文字重叠,如何解决?
A:常见于维度较多(>8个),方法:
- 减小字体:
ax.set_xticklabels(categories, fontsize=8) - 旋转标签:
for label in ax.get_xticklabels(): label.set_rotation(30) - 调整画布尺寸:
figsize=(8,8)
Q3:如何让多张图保持相同的颜色和样式?
A:将颜色值定义为全局变量,例如COLOR_SCHEME = ['#2E86C1', '#E74C3C', ...],在循环中固定调用color=COLOR_SCHEME[0],若需区分类别,可根据索引分配不同颜色。
Q4:脚本运行慢,如何处理上千张图?
A:优化内存:关闭plt.close();使用并行计算(如concurrent.futures)分批次处理;或将数据分块,每个块单独运行脚本。
进阶技巧:定制化与动态更新
- 添加数据标签:在雷达图数据点上显示具体数值,使用
ax.text()或ax.scatter()配合annotate - 动态读取最新数据:使用
os.listdir监控文件夹,当新CSV文件出现时自动触发绘图 - 输出为SVG格式:便于矢量编辑,将
plt.savefig的扩展名改为.svg - 整合Web应用:用Flask构建简单界面,用户上传Excel后返回ZIP压缩的图片包
批量生成数据雷达图并非难事,核心在于将手动重复劳动转化为可复用的代码。 本文提供的脚本框架已满足大多数场景,你只需替换数据源、调整维度区间与颜色,即可快速部署。
延伸阅读:
- Matplotlib官方文档:雷达图定制示例
- Pandas数据清洗:缺失值处理技巧
- Python脚本部署:使用
schedule库定时生成报表
(文末无统计字数提示)