怎样用脚本批量生成数据雷达图?

wen 实用脚本 1

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

怎样用脚本批量生成数据雷达图?

目录导读

  1. 为什么需要批量生成雷达图? – 场景与痛点
  2. 核心工具与环境准备 – Python + Matplotlib + Pandas
  3. 三步写脚本:读取数据、多子图布局、自动保存
  4. 常见问题问答 – 应对数据缺失、标签重叠、颜色统一
  5. 进阶技巧:定制化与动态更新

为什么需要批量生成雷达图?

在数据分析报告、竞品对比或性能评估中,雷达图(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库定时生成报表

(文末无统计字数提示)

抱歉,评论功能暂时关闭!