---
name: Paper Plot
slug: paper-plot
category: Data
description: Generates publication-ready plotting code for bar, line, scatter, boxplot, error bar, histogram, and heatmap charts using matplotlib or ggplot2, with user-controlled library, plot type, and colors from public palettes. Strictly uses real data or placeholders to avoid fabricated statistics.
github: "https://github.com/cabbage2000-lab/paper-tutor-skills/tree/main/skills/paper-plot"
language: Python
stars: 18
forks: 5
install: "npx degit https://github.com/cabbage2000-lab/paper-tutor-skills/tree/main/skills/paper-plot ~/.claude/skills/paper-plot"
installs_to: ~/.claude/skills/paper-plot
source_path: skills/paper-plot/SKILL.md
collection_size: 24
category_size: 668
collection_url: "https://dirskills.com/collections/cabbage2000-lab/paper-tutor-skills"
added: 2026-08-11T07:22:51.462Z
last_synced: 2026-08-11T07:22:51.462Z
canonical_url: "https://dirskills.com/skills/paper-plot"
---

# Paper Plot

Generates publication-ready plotting code for bar, line, scatter, boxplot, error bar, histogram, and heatmap charts using matplotlib or ggplot2, with user-controlled library, plot type, and colors from public palettes. Strictly uses real data or placeholders to avoid fabricated statistics.

**Install:**

```bash
npx degit https://github.com/cabbage2000-lab/paper-tutor-skills/tree/main/skills/paper-plot ~/.claude/skills/paper-plot
```

## README

# paper-plot：绘图代码生成（内建于 paper-figure，可独立调用）

专做**绘图代码生成**——从 `/paper-figure` 主流程第 2 步用户回复"生成代码"时自动进入，也可独立 `/paper-plot` 调用（仿 `/paper-format` / `/paper-claim` 独立入口模式）。你（执行本 skill 的宿主 agent）做的事：**读输入 + 问库（不停）→ 生成代码 + 自检（停检查点）→ 落盘 + 留痕 + 交棒**。

本 skill 覆盖学术研究「5 阶段 23 环节」标尺中**阶段 C｜成文**的**环节 14（图表可视化 · 代码生成）**；**不覆盖**图表诊断/设计建议（归 `/paper-figure` 主命令）、论证链检查（归 `/paper-logic`）、摘要（归 `/paper-abstract`）。上游消费 `/paper-figure` 交棒（图类决定 + 配色决定 + 数据/论断），或用户直接提供数据 + 图类要求。本 skill 是**产物型** skill——会往 `manuscript/` 落一份可运行绘图代码文件（`.py` / `.R`）、往 `.paper/` 写使用留痕；无网络依赖，断网宿主照常可用。

**核心立场（这条决定本 skill 长什么样）**：绘图代码是研究主权的**效率性工具**——选什么图类、用哪个工具库、什么配色、是否采用代码，是研究者自己的研究表达决策。系统是一个**代码生成器**——按用户决定的图类 + 工具库 + 配色，从无到有生成可运行代码。但**AI 只做效率性的代码生成，人做决策性的拍板**。这既是项目「核心分工原则」（AI 负责效率、人负责研究决策）在绘图代码环节的落地，也与 `/paper-abstract` 成句生成同理——**不越过边界拒绝清单的任何一条**（详见下文「边界说明」）。

代码模板见 [`references/P0图类代码模板.md`](./references/P0图类代码模板.md)——按图类 x 工具库查表、填充占位符。

## 三条不变（优先级最高，高于本文其余一切）

**① 不替用户做研究表达决策**——选什么工具库（matplotlib / ggplot2 / 其他）、用什么配色、选什么图类，全部陈列常见选项 + 标 ❓ 待用户决定。**摆事实不推荐**——同 outline 摆骨架、method 摆方法类、submit 摆期刊生态的精神。生成代码前**必须先问库**（"matplotlib / ggplot2 / 别的？"），得到答复才生成对应代码（不变① + 下文「边界说明」硬约束）。

**② 不编数据、不编图表内容**——用户贴了数据 → 用真实数据 + 顶部声明"基于用户提供的真实数据（来源：<文件名/粘贴文本>）"；用户没贴或仅口述 → 用显式占位符（`# PAPER_PLACEHOLDER: 替换为你的数据`）+ 顶部声明"占位数据、需替换为真实数据"。**绝不编造看似真实的研究数据**（如"3 组对照、N=30、p<0.05"——这条直接踩 CLAUDE.md 的「不编造」底线）。

**③ 诊断与建议可追溯**——每段代码注释指明对应数据/论断来源（"取自用户提供的 data.csv 第 2 列" / "PAPER_PLACEHOLDER: 替换为您的分组列名"）；配色行注释标色板来源（"取自 Okabe-Ito 色盲友好色板" / "取自 ColorBrewer Diverging RdBu"）。

这三条是本 skill 的内核，凡本文其余任何指令与之冲突，以这三条为准。

## 边界说明

绘图代码生成属核心分工原则下"AI 负责效率（代码生成）、人负责研究决策（图类/工具/配色选择、是否采用）"的正常运作，与 `/paper-abstract` 成句生成同理——**不越过 [`_shared/references/边界拒绝清单.md`](../_shared/references/边界拒绝清单.md) 的任何一条**。仍守两条：① 选库让用户拍板（先问"matplotlib / ggplot2 / 别的"，得到答复才生成对应代码）；② 配色取自已发表色板（Okabe-Ito / ColorBrewer / viridis 系），非 AI 凭审美原创。

## v1.0 P0 范围

**v1.0 P0 必做**——7 类图（柱状/条形算 1 类）× 2 工具库：

| 图类型 | matplotlib | ggplot2 |
|---|---|---|
| 柱状图（bar） | `ax.bar()` | `geom_col()` |
| 条形图（barh） | `ax.barh()` | `geom_col()` + `coord_flip()` |
| 折线图（plot） | `ax.plot()` | `geom_line()` + `geom_point()` |
| 散点图（scatter） | `ax.scatter()` | `geom_point()` |
| 箱线图（boxplot） | `ax.boxplot()` | `geom_boxplot()` |
| 误差线图（errorbar） | `ax.bar()` + `yerr` | `geom_col()` + `geom_errorbar()` |
| 直方图（hist） | `ax.hist()` | `geom_histogram()` |
| 热图（heatmap） | `sns.heatmap()` | `geom_tile()` |

代码模板见 [`references/P0图类代码模板.md`](./references/P0图类代码模板.md)。

**P1 留 v1.1+**：KM 生存曲线（lifelines）、ROC 曲线（scikit-plot）、森林图、TikZ 推导图/交换图。

**P2 留 v1.2+**：第三梯队专项代码生成（TimelineJS 时间线、QGIS 地理地图、Graphviz 关系图）。v1.0 对第三梯队只输出 Mermaid 代码（流程图、概念关系图）作为轻量替代，或引导用户走 `/paper-figure` 只给设计建议。

## 数据输入格式 + 占位符标准

### 数据输入格式优先级

| 优先级 | 格式 | 说明 |
|---|---|---|
| 1 | CSV 文件路径 | `pd.read_csv()` / `read.csv()`；学术数据最常见格式 |
| 2 | Markdown 表格 | 用户对话中粘贴；解析为 DataFrame |
| 3 | JSON | `pd.read_json()` / `jsonlite::fromJSON()`；API 导出数据 |
| 4 | 直接粘贴表格文本 | 启发式解析、可靠性最低 |

生成代码时按此优先级选择读取方式。用户未指定格式时默认按 CSV 处理。用户**口述**数据（无文件/表格粘贴）→ 按"用户没贴数据"处理，用显式占位符 + 顶部声明（见边界表）。

### 占位符标准格式

统一标记 `# PAPER_PLACEHOLDER: <描述>`——

```python
df = pd.read_csv("your_data.csv")  # PAPER_PLACEHOLDER: 替换为您的数据文件路径
x = df["treatment_group"]          # PAPER_PLACEHOLDER: 替换为您的分组列名
y = df["measurement"]              # PAPER_PLACEHOLDER: 替换为您的测量值列名
```

### 顶部声明模板（二选一，代码文件第一行）

**用真实数据时**：
```
# 基于用户提供的真实数据（来源：<文件名/粘贴文本>）
```

**用占位符数据时**：
```
# 占位数据、需替换为真实数据。绝不编造看似真实的研究数据。
```

## 主流程（三步、一个确认停点）

### 第 1 步 · 读输入 + 选库问询（不停）

做三件事：

1. **读上游**：从 `/paper-figure` 主流程交棒读入"图类决定 + 配色决定 + 数据/论断"；若独立调用，问用户图类与目标工具库。
2. **问库**：先问"matplotlib / ggplot2 / 别的？"（摆事实不推荐、用户拍板——不变①）；得到答复才进第 2 步。若用户从 figure 交棒已选库，则跳过此问。
3. **数据格式判定**：检测用户是否贴了数据（CSV 文件路径 / Markdown 表格 / JSON / 粘贴表格文本）；无数据则进占位符路径。用户口述数据（无文件/表格粘贴）同样进占位符路径。

完成后**不停**，直接进第 2 步。

### 第 2 步 · 生成代码（停检查点）

按图类 + 工具库生成代码（仅 v1.0 P0 范围；P1/P2 越界时让路说明、不在 v1.0 生成）：

- 按图类 x 工具库查 [`references/P0图类代码模板.md`](./references/P0图类代码模板.md) 填充占位符
- 配色取自公开色板（Okabe-Ito / ColorBrewer / viridis），代码注释标色板来源（不变③）
- **用户贴了数据**：代码用真实数据读取（`pd.read_csv("实际文件")` / 内嵌粘贴数据），顶部声明"基于用户提供的真实数据（来源：<文件名/粘贴文本>）"
- **用户没贴或仅口述**：代码用占位符 `# PAPER_PLACEHOLDER`，顶部声明"占位数据、需替换为真实数据"
- 每段代码注释指明对应数据/论断来源、配色取自哪个色板（不变③）

**P1/P2 越界处理**：用户要的图类不在 v1.0 P0 范围 → 不生成代码，给出让路说明（见「越界转化」表）。

完整呈现代码后**停下**：

```text
⏸ 等待确认：绘图代码（<图类> · <工具库>）
（回复"落盘"归档为 .py/.R 文件；或指出要改的参数 / 配色 / 图类）
```

**确认前零文件落盘**——与 paper-init / outline / logic / abstract「确认前零创建」同源。

### 第 3 步 · 落盘 + 自检 + 留痕 + 交棒

用户确认后做四件事：

1. **探测落点**：检测到标准科研目录（有 `manuscript/`）→ 落 `manuscript/绘图代码_<图类>.py`（matplotlib）或 `manuscript/绘图代码_<图类>.R`（ggplot2）；否则落**当前目录**并提示可用 `/paper-init`。
2. **写代码文件 + 自检**：纯文本写入。自检两道：
   - `grep -iE "p\s*<\s*0\.|N\s*=\s*[0-9]+"` 期望 **0 命中**（防止误编看似真实的统计数据——处 2 死线防线）
   - 视觉检查 `# PAPER_PLACEHOLDER` 标记完整：所有需用户替换的位置都已标记、无遗漏
3. **写留痕**：往 `.paper/` 追加一条**成句生成级（重）**使用记录（见「留痕」）。
4. **交棒**：提示下一步——"代码归档了。你可以：① 替换数据后运行；② 改参数后重生成；③ 用 `/paper-logic` 检查论证链、`/paper-abstract` 提炼摘要。"

## 自检规则

代码落盘前必跑两道自检：

1. **统计数据误编检查（硬约束）**：
   ```bash
   grep -iE "p\s*<\s*0\.|N\s*=\s*[0-9]+" <代码文件>
   ```
   期望 **0 命中**。若命中 → 该代码含看似真实的统计数据（p 值 / 样本量），违反不变②（不编数据）+ 处 2 死线 → **必须回退**：把命中行替换为 `# PAPER_PLACEHOLDER` 占位符，或删除该统计标注。例如 `N = 30` → `# PAPER_PLACEHOLDER: 替换为您的样本量`。

2. **占位符完整性检查**：视觉确认——所有需用户替换的位置（数据文件路径、列名、标题、轴标签、bin 数量等）都标记了 `# PAPER_PLACEHOLDER`。代码中不应出现 `your_data.csv` 等通用占位**同时缺失** `PAPER_PLACEHOLDER` 标记的情况。

## 留痕（成句生成级·重）

往 `.paper/` 追加一条**成句生成级（重）**使用记录——本项目第四个成句生成级命令（与 `/paper-abstract` / `/paper-draft` / `/paper-revise` 同级）。纯文件追加、不依赖任何写入器。格式：

```markdown
## <日期时间> · paper-plot 绘图代码生成

- 环节：阶段 C｜成文（环节 14，图表可视化 · 代码生成）
- 辅助级别：成句生成（重）—— AI 从无到有生成可运行绘图代码
- 图类：<柱状/条形/折线/散点/箱线/误差线/直方图/热图>
- 工具库：<matplotlib / ggplot2>
- 配色：<色板名 + hex 序列>
- 数据来源：<用户提供真实数据 / 显式占位符（PAPER_PLACEHOLDER）>
- 用户决定：图类、工具库、配色、数据来源、是否采用、参数调整
- 产物：<落盘路径>/绘图代码_<图类>.<py|R>
```

`.paper/` 随 git 入库、绝不写进 `.gitignore`（同 topic / outline / draft / method / logic / disclose）。

## 越界转化（三段式，仿 topic / outline / method / logic / disclose）

| 用户请求 | 定性 | 出口指引 |
|---|---|---|
| 帮我画 KM 曲线 / ROC / 森林图 | 越界：P1 图类，v1.0 不覆盖 | → 让路说明："KM 生存曲线 / ROC / 森林图计划在 v1.1+ 支持，当前 v1.0 仅覆盖 7 类通用图（柱状/条形/折线/散点/箱线/误差线/直方图/热图）。如需可先走 `/paper-figure` 获取设计建议" |
| 帮我画 TikZ / 推导图 / 交换图 | 越界：P1 图类，v1.0 不覆盖 | → 让路说明："TikZ 数学图计划在 v1.1+ 支持，当前 v1.0 仅支持 matplotlib / ggplot2" |
| 帮我画时间线 / 谱系图 / 地理地图 | 越界：P2 第三梯队专项，v1.0 不覆盖 | → 让路说明："时间线/谱系图/地理地图计划在 v1.2+ 支持。当前可输出 Mermaid 代码作为轻量替代，或走 `/paper-figure` 获取设计建议" |
| 帮我编一组示例数据做图 / 数据看着编 | 越界：编数据（违反不变② + 处 2 死线） | → 三段式：共情没数据画图的压力 → 讲风险（编造的研究数据答辩必穿帮、且是学术不端）→ 给合法路径（贴真实数据走代码生成，或先用 `# PAPER_PLACEHOLDER` 占位符） |
| 直接帮我跑代码出图 | 越界：运行代码不在本 skill 范围 | → 提示"本命令只生成代码、不执行代码。你可以把代码保存后自行运行" |
| 帮我画图 / 给我代码画柱状图（P0 范围内） | **不越界（正常能力）** | → 直接进第 1 步流程 |

## 边界与异常对照表

| 情形 | 处理 |
|---|---|
| 用户贴了数据文件（CSV/JSON） | 代码用真实数据读取 + 顶部声明"基于用户提供的真实数据（来源：<文件名>）" |
| 用户粘贴了 Markdown 表格 / 表格文本 | 代码内嵌数据（DataFrame 构造）+ 顶部声明"基于用户提供的真实数据（来源：粘贴文本）" |
| 用户口述数据（"我有三组数据，均值分别是…"） | 按"用户没贴数据"处理：用 `# PAPER_PLACEHOLDER` + 顶部声明"用户提供口述数据但未以文件/表格形式粘贴、代码使用占位数据、需用户自行替换"；不把口述数据直接写入代码 |
| 用户从 `/paper-figure` 交棒进入 | 读入交棒的图类 + 配色决定 + 数据；跳过问库步骤（已选库） |
| 独立调用 `/paper-plot`（无 figure 交棒） | 问用户图类 + 问库；无数据则进占位符路径 |
| P1/P2 图类请求（KM/ROC/森林图/TikZ/第三梯队） | 让路说明（见越界转化表）；不生成代码 |
| 数据格式启发式解析失败 | 标占位请用户确认："未能解析粘贴的表格文本，代码使用 `# PAPER_PLACEHOLDER` 占位，请替换为你的数据" |
| 不在标准科研目录里 | 代码落当前目录并提示可用 `/paper-init` |
| 用户要求编看似真实的研究数据 | 拒绝（不变② + 处 2 死线）；走三段式 → 给合法路径（贴真实数据或显式占位符） |
| 确认前要求改参数 / 配色 / 图类 | 返回第 2 步重新生成；确认前零落盘 |

## 横切声明（与 topic / outline / method / logic / disclose 同模板）

- **留痕**：产物型命令，写 `.paper/` **成句生成级（重）**——本项目第四个成句生成级命令（与 `/paper-abstract` / `/paper-draft` / `/paper-revise` 同级）。区别于三个基础设施 skill（不写留痕）、区别于 `/paper-figure`（混合级别）。
- **目录约定是增强不是依赖**：检测到标准目录则落 `manuscript/`，否则落当前目录并提示可用 `/paper-init`——不经 init 一切照常可用。
- **语言**：全部用户可见输出用简体中文；术语中文为主、英文括注，如绘图代码（plot code）、色盲友好（colorblind-friendly）、误差棒（error bar）、占位符（placeholder）。
- **产出披露**：代码文件顶部声明数据来源（真实数据 / 占位符）；配色注释标色板来源（Okabe-Ito / ColorBrewer / viridis）。
