---
name: 科研可视化工具
slug: math-modeling-skill
category: Data
description: 科研可视化工具从数据剖析到出版级成图，先做 EDA、选图决策和错误拦截，再进行绘制、自检与多格式导出。适合论文配图、科研数据可视化和数学建模结果图制作。
github: "https://github.com/XiaoMaColtAI/math-modeling-skill/tree/main/tools/figure"
language: Python
stars: 819
forks: 51
install: "npx degit https://github.com/XiaoMaColtAI/math-modeling-skill/tree/main/tools/figure ~/.claude/skills/figure"
installs_to: ~/.claude/skills/figure
source_path: tools/figure/SKILL.md
collection_size: 10
category_size: 668
collection_url: "https://dirskills.com/collections/XiaoMaColtAI/math-modeling-skill"
added: 2026-08-23T05:18:41.780Z
last_synced: 2026-08-23T05:18:41.780Z
canonical_url: "https://dirskills.com/skills/math-modeling-skill"
---

# 科研可视化工具

科研可视化工具从数据剖析到出版级成图，先做 EDA、选图决策和错误拦截，再进行绘制、自检与多格式导出。适合论文配图、科研数据可视化和数学建模结果图制作。

**Install:**

```bash
npx degit https://github.com/XiaoMaColtAI/math-modeling-skill/tree/main/tools/figure ~/.claude/skills/figure
```

## README

# 科研可视化工具

> 从数据剖析到出版级成图 | Python + MATLAB | 自检 + AI 读图闭环

## 路径

- `SKILL_ROOT`：math-modeling-skill 仓库根目录（只读）。
- 本文件中所有 `tools/figure/...` 路径均相对于 `SKILL_ROOT`。
- CLI 命令使用 `"<SKILL_ROOT>/tools/figure/scripts/..."` 格式，确保从任何工作目录均可执行。
- Python import 使用 `sys.path.insert(0, os.path.join(SKILL_ROOT, 'tools', 'figure', 'scripts'))` 后导入。

## 概述

本工具融合 nature-figure 的图表契约/后端路由架构与 scipilot-figure-skill 的数据剖析/选图决策/自检闭环，
并扩展数学建模特有的三类图体系和子问题覆盖检查。**永远先思考再画**：

1. 先理解数据再选图——拿到数据先做 EDA，用事实驱动图型选择
2. 先想清楚"这张图要论证什么"——同样数据，不同论点 = 不同图
3. 主动拦截科研画图的经典错误，而不是顺从
4. 维度太多就建议拆图，不硬塞

**只覆盖纯数据图**：折线、柱状、散点、箱线/小提琴、热力图、误差棒、分布图、相关性矩阵、雷达图、
3D 曲面、多面板组合。**不做**示意图、流程图、架构图。

## 工作流

### 第 1 步：数据剖析

```bash
python "<SKILL_ROOT>/tools/figure/scripts/profile_data.py" data.csv --group group --group condition
```

输出：每列类型、样本量、缺失率、连续列描述统计 + 偏度 + 异常值、分组样本量分布、相关性矩阵、初步图型建议。
不会读报告？查 `tools/figure/references/guides/data_profiling.md`。

**重点核对**：列类型识别对不对？每组 n 是多少？是否高度偏态？是否需要对数轴？

**数学建模场景**：从题目分析报告提取全部子问题并规范为 `q1…qN`，按子问题核对行列、类型、缺失、
分组样本量、分布、异常值和单位。

### 第 2 步：图表契约

在选图之前，先填写五点契约（详见 `tools/figure/static/core/contract.md`）：

1. **核心结论**：一句话写出这张图必须捍卫的论点
2. **证据链**：每个面板对应论点的哪个证据环节
3. **版型**：quantitative grid / schematic-led composite / image plate + quant / asymmetric mixed-modality
4. **后端**：Python 或 MATLAB
5. **期刊/导出规范**：最终尺寸、可编辑文字、源数据、统计口径、导出格式

### 第 3 步：选图决策

**永远先选图型，再画图。** 图型选错，画得再好看也没用。

基于第 1、2 步的事实，查 `tools/figure/references/chart-types/chart_selection.md` 的决策框架：

- **按数据形态选图**：连续变量看分布→直方图/KDE/箱线，分类+连续看比较→箱线/柱状，两连续看关系→散点+回归，时间趋势→折线，多变量相关→热力图/pairplot
- **按论证意图选图**：同一批数据，不同论点→不同图（"整体差异"用箱线，"动态变化"用折线，"个体差异"用散点）
- **给出推荐 + 简短理由 + 1-2 个备选**
- 数据维度过多（分组组合 > 12）→ **明确建议拆图**
- 用户指定图型不适合数据 → **善意指出问题并说明更好的选择**（如 n<10 要画均值柱→建议箱线/stripplot）
- 数学建模场景：查 `chart_selection.md` 末尾的"数学建模场景速查"表
- **图型多样**：全文图型种类 ≥ 3 种，避免全部柱状或全部折线；每个面板回答唯一问题，不重复展示相同数据（详见 `design_theory.md` §11 反冗余清单）

### 第 4 步：查期刊规范

确定目标期刊后查 `tools/figure/references/quality/journal_specs.md` 拿到：单/双栏宽（mm 与 inch）、字号、
推荐字体、DPI、矢量格式偏好。不知道目标期刊就问一句。

### 第 5 步：配环境

**Python**：

```python
import sys, os
sys.path.insert(0, os.path.join(SKILL_ROOT, 'tools', 'figure', 'scripts'))
from setup_style import setup_style
setup_style(journal='nature', lang='en')             # 英文 Nature
setup_style(journal='general', lang='zh', serif_for_zh=True)   # 中文宋体混排
```

`SciencePlots` 装了自动用，没装回退到内置预设。

**MATLAB**：将 `references/roles/编程手/scripts/apply_publication_style.m` 复制到 `PROJECT_ROOT/utils/` 后调用。

### 第 6 步：绘制

按 `tools/figure/references/api-templates/plot_recipes.md` 对应章节的配方画。每节都有可直接复制的代码 + 常见坑。

**Python** 画图时强制做到：
- `figsize=(目标宽, 目标高)` 单位英寸——直接定最终尺寸
- 用 `seaborn.color_palette('colorblind')` 或 Okabe-Ito + 冗余编码（不同线型/marker）
- 误差棒/阴影要在图注交代是 SD / SEM / 95% CI + n

**MATLAB**：按 `references/roles/编程手/scripts/apply_publication_style.m` 的出版规范绘制，用 `export_publication_figure()` 导出。

数学建模场景（两种语言均适用）：按三类图体系生成（原始数据图 / 过程图 / 结果图），每类至少 3 张、合计至少 9 张，且每个子问题在三类中各至少 1 张。**每类内部图型要有变化**（如原始数据类至少含 1 张分布图 + 1 张关系图），全文图型种类 ≥ 3 种。

### 第 7 步：自检闭环（三层全过）

1. **语义层**：`tools/figure/references/design/viz_pitfalls.md` 18+ 条避坑清单——图型/配色/误差是否踩坑
2. **形式层**：`tools/figure/references/quality/publication_checklist.md` 形式合规（尺寸、DPI、字号、误差交代）
3. **视觉层**：
   - **Python**：`tools/figure/scripts/visual_qa.render_preview(fig, 'figs/_preview.png')` 渲预览，`tools/figure/scripts/visual_qa.audit_layout(fig)` 程序抓缺字/裁切/重叠
   - **MATLAB**：用 `export_publication_figure()` 导出 PNG 后人工检查
   - 用 Read 工具读 PNG，对照 `tools/figure/references/quality/visual_review.md` 的 8 项清单核对
   - 发现问题 → 回改 → 重渲 → 再读，最多 3 轮

### 第 8 步：导出

**Python**：

```python
import sys, os
sys.path.insert(0, os.path.join(SKILL_ROOT, 'tools', 'figure', 'scripts'))
from export_figure import export_figure
export_figure(
    fig, basename='figs/fig1',
    formats=['pdf', 'svg', 'png'],
    size_inches=(3.5, 2.625),
    dpi=300,
    grayscale_preview=True,
)
```

**MATLAB**：使用 `export_publication_figure(fig, 'figs/fig1', 'png', 300)` 或 `export_publication_figure(fig, 'figs/fig1', 'svg')`。

数学建模场景（两种语言均适用）：同时输出 SVG 与至少 300 DPI PNG。

### 第 9 步：文件审计

两个脚本职责不同，按顺序执行：

```bash
# 1. 编程手自检：文件格式/DPI/字体合规（每张图都过）
python "<SKILL_ROOT>/tools/figure/scripts/check_figure.py" "<PROJECT_ROOT>/figures" --strict

# 2. 数学建模 P2 门禁：三类图数量 + 子问题覆盖（终检时由质检 Subagent 执行）
python "<SKILL_ROOT>/references/roles/编程手/scripts/figure_audit.py" "<PROJECT_ROOT>/figures" --questions q1 q2 ... qN --strict
```

- `check_figure.py`：检查单张图的格式合规性（DPI、字体、尺寸、矢量格式），编程手每次导出后自检用。
- `figure_audit.py`：检查三类图数量是否达标、子问题是否全覆盖，P2 编程终检时由独立质检 Subagent 执行。

## 主动拦截（顾问职责）

发现用户需求触发以下错误时，**先说明再给替代方案，不要默默照做**。完整清单见
`tools/figure/references/design/viz_pitfalls.md`。

| 错误 | 后果 | 替代方案 |
|---|---|---|
| n<10/组 还想画均值柱 | 掩盖分布、掩盖 n | 箱线 + stripplot |
| 双 Y 轴显示无关变量 | 视觉假相关 | 拆成上下子图共享 x |
| 用饼图展示占比 | 人眼判角度差长度 3 倍 | 横向柱状（按值排序） |
| 3D 柱 / 3D 饼 | 视角扭曲数值 | 2D 柱、热力图 |
| 比例图 Y 轴不从 0 起 | 误导小差异 | 从 0 起或用 log |
| x 是分类却用折线连均值 | 暗示假连续 | 散点/点图/柱状 |
| rainbow / jet 色图 | 感知不均匀 | viridis / magma / RdBu_r |

尊重用户最终决定，但**留下明确的劝阻记录**。

## 参考文档

`tools/figure/references/` 下文档——**按需读，不要一次全读**：

### 选图与决策

| 文档 | 何时读 |
|---|---|
| `chart-types/chart_selection.md` | **每次选图必读**——决策框架、不同论点→不同图 |
| `guides/figure_contract.md` | 多面板图的契约工作流——核心结论→证据链→面板映射→审稿人风险 |

### 配方与模板

| 文档 | 何时读 |
|---|---|
| `api-templates/plot_recipes.md` | 各类图完整配方（含数学建模专用模式） |
| `guides/tutorials.md` | 端到端可运行教程——分组柱状/收敛曲线/热力图/森林图 |
| `api-templates/api.md` | 可复用辅助函数（make_grouped_bar/make_trend/make_heatmap 等） |
| `api-templates/template_catalog.md` | CSV 驱动模板——ROC/热力图/收敛曲线 |

### 自检与合规

| 文档 | 何时读 |
|---|---|
| `design/viz_pitfalls.md` | 自检前必读——18+ 条避坑清单 |
| `quality/qa_contract.md` | 交付前 QA 契约——统计图注最小模板 |
| `quality/publication_checklist.md` | 投稿前最后过形式合规清单 |
| `quality/visual_review.md` | 出图后视觉自检——AI 读图 8 项清单 |

### 设计与布局

| 文档 | 何时读 |
|---|---|
| `design/design_theory.md` | 配色/字体/布局/导出理论 |
| `guides/nature_2026_observations.md` | Nature 页面布局原型——示意图主导/非对称/密集分类 |
| `chart-types/chart_types.md` | 雷达/3D/散点等高级图型 |
| `design/common_patterns.md` | hero panel 等布局模式 |
| `guides/figure_legend_conventions.md` | 图注写作规范——结构/时态/自足/进阶 |

### 数据与工具

| 文档 | 何时读 |
|---|---|
| `guides/data_profiling.md` | 读不懂 `profile_data.py` 输出 |
| `quality/journal_specs.md` | 不确定目标期刊的栏宽/字号/DPI/字体 |
| `guides/asset_adaptation.md` | 复用模板时的数据映射规则 |

## 依赖

```
matplotlib>=3.7
seaborn>=0.13
plotly>=5.18
pandas>=2.0
numpy>=1.24
scipy>=1.10
Pillow>=10.0
SciencePlots>=2.1      # 可选
pypdf>=4.0             # 可选；字体嵌入检查
kaleido>=0.2.1         # 可选；plotly 导出
```

可选依赖缺失时优雅降级并提示。

## 核心原则

1. **按最终尺寸出图，不二次缩放**——figsize 直接设论文实际尺寸
2. **矢量优先**——折线/柱状/散点/热力/误差棒 → PDF/SVG，不用 JPEG
3. **配色对色盲友好**——默认 colorblind 色板 + 冗余编码 + 灰度预览
4. **字号可读**——正文标签和刻度数字 7-9 pt，最小 ≥ 6 pt
5. **误差必有交代**——图注必须写清误差类型、样本量 n、检验方法、显著性符号定义
6. **图型多样**——同一道题的全部图应覆盖 ≥ 3 种不同图型（如折线、柱状、散点、热力图、箱线、直方图、雷达图等），避免全部是柱状图或全部是折线图；每个面板必须回答一个唯一的问题，不得用不同图表形式重复展示相同数据（详见 `design_theory.md` §11 反冗余清单）

## 何时加载

| 情形 | 读取 |
|---|---|
| 画图 | 本文件 `tools/figure/SKILL.md` |
| 不确定用什么图 | `tools/figure/references/chart-types/chart_selection.md` |
| 需要图表函数 | `tools/figure/references/api-templates/plot_recipes.md` |
| 交付前 | `tools/figure/references/quality/publication_checklist.md` |
| MATLAB 出版绘图 | `references/roles/编程手/scripts/apply_publication_style.m` + `export_publication_figure.m` |
