如何用脚本批量导出数据图表?

wen 实用脚本 1

本文目录导读:

如何用脚本批量导出数据图表?

  1. 场景一:用 Python + Matplotlib/Seaborn 导出静态图片(最通用)
  2. 场景二:用 Python + Pandas + Openpyxl 导出图表嵌入到 Excel 文件中
  3. 场景三:用 SQL + BI 工具脚本导出(如 Tableau / Power BI / Metabase)
  4. 场景四:用 R + ggplot2 批量导出(适合统计人员)
  5. 需要补充哪些信息?—— 帮你更精确匹配方案

这是一个比较宽泛的问题,要给出具体脚本,需要明确几个关键信息:数据源在哪里(数据库、Excel、CSV、API)、要导出成什么格式(图片PNG/JPG、PDF、HTML交互图、Excel图表)、用什么工具/语言(Python、SQL、BI工具内置脚本)。

下面按最常见的几种场景给出脚本示例和实现思路。


用 Python + Matplotlib/Seaborn 导出静态图片(最通用)

这是最灵活的方式,如果你有一张 Excel 或 CSV 表,想为每一行(或每一类)数据生成一张图表图片。

目标:为每个销售员生成一张月度业绩折线图。 数据源:一个 CSV 文件,包含 salesperson, month, revenue 列。

import pandas as pd
import matplotlib.pyplot as plt
import os
# 1. 读取数据
df = pd.read_csv('sales_data.csv')
# 2. 创建一个文件夹来存放导出的图片
output_dir = 'exported_charts'
os.makedirs(output_dir, exist_ok=True)
# 3. 按 'salesperson' 分组,为每个人生成图表
for salesperson, group in df.groupby('salesperson'):
    # 按月份排序
    group = group.sort_values('month')
    # 创建图表
    plt.figure(figsize=(10, 6))
    plt.plot(group['month'], group['revenue'], marker='o', linestyle='-', color='b')
    plt.title(f'{salesperson} Monthly Revenue')
    plt.xlabel('Month')
    plt.ylabel('Revenue')
    plt.grid(True, linestyle='--', alpha=0.6)
    plt.xticks(rotation=45)
    plt.tight_layout()
    # 4. 保存为图片(文件名用销售员名字)
    plt.savefig(f'{output_dir}/{salesperson.replace(" ", "_")}_revenue.png', dpi=150)
    plt.close()  # 关闭当前图表,释放内存
print(f"Exported charts to {output_dir} directory.")

可调整项

  • 改变 plt.plotplt.bar(柱状图)或 plt.scatter(散点图)。
  • 导出格式:plt.savefig 支持 .png, .pdf, .svg, .jpg

用 Python + Pandas + Openpyxl 导出图表嵌入到 Excel 文件中

如果你希望生成的图表直接作为 Excel 工作表一部分,而不是图片文件。

import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows
# 1. 准备数据(可以是多个工作表)
df = pd.DataFrame({
    'Month': ['Jan', 'Feb', 'Mar', 'Apr'],
    'Product_A': [100, 120, 90, 140],
    'Product_B': [80, 95, 110, 85],
    'Product_C': [60, 75, 70, 90]
})
# 2. 创建 Excel 工作簿
wb = Workbook()
ws = wb.active= "Data"
# 3. 将数据写入工作表
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)
# 4. 创建图表
chart = LineChart()
chart.title = "Monthly Product Sales"
chart.x_axis.title = "Month"
chart.y_axis.title = "Sales"
# 5. 定义数据范围(注意 Excel 单元格引用从1开始)
data_ref = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=5)  # 数据列 B-D
categories_ref = Reference(ws, min_col=1, min_row=2, max_row=5)       # 月份列 A
chart.add_data(data_ref, titles_from_data=True)  # 第一行为标题
chart.set_categories(categories_ref)
# 6. 将图表放置在工作表指定位置
ws.add_chart(chart, "F2")
# 7. 保存
wb.save('product_sales_with_chart.xlsx')

批量处理:可以在循环中创建多个工作表(ws = wb.create_sheet(title=f'Sheet_{i}')),在每个工作表中生成不同的图表。


用 SQL + BI 工具脚本导出(如 Tableau / Power BI / Metabase)

如果你已经在用 BI 工具,通常它们内置了脚本或API。

  • Tableau:使用 tabcmd 命令 + 批处理脚本。

    # Windows .bat 示例
    tabcmd login -s https://yourserver -u username -p password
    tabcmd export "YourWorkbookName" --png --filename "C:\exports\dashboard_%date:/=%"
    tabcmd logout
  • Metabase(开源BI):通过其 API 导出,需要先通过API获取图表ID,再导出图片。

    # 1. 获取会话令牌
    curl -X POST "https://metabase.example.com/api/session" \
         -H "Content-Type: application/json" \
         -d '{"username": "admin@example.com", "password": "yourpass"}' \
         -o session.json
    # 2. 从JSON中提取令牌(假设用 jq)
    TOKEN=$(cat session.json | jq -r '.id')
    # 3. 循环导出图表(假设有一个卡片列表 cards.txt)
    for card_id in $(cat cards.txt); do
        curl "https://metabase.example.com/api/card/$card_id/query/json" \
             -H "X-Metabase-Session: $TOKEN" \
             -o "card_${card_id}.json"
    done

    注意:Metabase 直接导出图表图片较复杂,通常先导出数据,再用 Python 画图。


用 R + ggplot2 批量导出(适合统计人员)

library(ggplot2)
library(dplyr)
# 读取数据
df <- read.csv("sales_data.csv")
# 创建输出文件夹
dir.create("exported_charts", showWarnings = FALSE)
# 按 salesperson 分组画图并保存
for (person in unique(df$salesperson)) {
  person_data <- df %>% filter(salesperson == person)
  p <- ggplot(person_data, aes(x = month, y = revenue, group = 1)) +
    geom_line(color = "blue") +
    geom_point() +
    ggtitle(paste(person, "Monthly Revenue")) +
    theme_minimal()
  # 保存为 png
  ggsave(filename = paste0("exported_charts/", gsub(" ", "_", person), "_revenue.png"),
         plot = p, width = 10, height = 6, dpi = 150)
}

需要补充哪些信息?—— 帮你更精确匹配方案

如果能告诉我以下两点,可以给出更精确的脚本:

  1. 数据来源

    • [ ] 单个/多个 Excel 文件
    • [ ] 数据库(MySQL / PostgreSQL / SQL Server)
    • [ ] 在线表格(Google Sheets)
    • [ ] REST API / JSON 接口
  2. 输出需求

    • [ ] 每个数据行/类别生成一张独立的图片(如每个客户一张)
    • [ ] 同一个图表导出为不同格式(PNG、PDF、SVG)
    • [ ] 生成一个 PDF 文件包含多张图表(每页一张)
    • [ ] 生成交互式 HTML 图表(Plotly / Bokeh)
  3. 图表类型

    • [ ] 折线图 / 柱状图 / 饼图 / 散点图
    • [ ] 复杂的组合图(双Y轴、热力图、瀑布图)

请补充细节,我可以帮你写一个可直接运行的完整脚本。

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