Paper 绘图代码生成命令(内建于 paper-figure,可独立调用)。当用户要生成绘图代码、plot 代码、画图代码、matplotlib 代码、ggplot2 代码、帮我生成图表代码、帮我写画图脚本、生成柱状图代码、散点图代码、折线图代码、箱线图代码、误差线图代码、直方图代码、热图代码,或说"帮我画个图""帮我写段代码画柱状图""给我一个 matplotlib 脚本"也触发——即使用户只说"画图""plot""代码画图"也应使用。行为铁律:仅 v1.0 P0 7 类图(柱状/条形算 1 类:柱状/条形/折线/散点/箱线/误差线/直方图/热图)× matplotlib + ggplot2;选库让用户拍板(先问 matplotlib/ggplot2/别的,得到答复才生成);配色取自公开色板(Okabe-Ito/ColorBrewer/viridis,非 AI 原创);真实数据或显式占位符(PAPER_PLACEHOLDER),绝不编看似真实的研究数据;确认前零落盘。"帮我画 KM 曲线""帮我画 ROC""帮我画森林图""帮我画 TikZ"走让路说明(v1.1+);"帮我编...
Scanned 8/31/2026
Install via CLI
openskills install cabbage2000-lab/paper-tutor-skills---
name: paper-plot
description: Paper 绘图代码生成命令(内建于 paper-figure,可独立调用)。当用户要生成绘图代码、plot 代码、画图代码、matplotlib 代码、ggplot2 代码、帮我生成图表代码、帮我写画图脚本、生成柱状图代码、散点图代码、折线图代码、箱线图代码、误差线图代码、直方图代码、热图代码,或说"帮我画个图""帮我写段代码画柱状图""给我一个 matplotlib 脚本"也触发——即使用户只说"画图""plot""代码画图"也应使用。行为铁律:仅 v1.0 P0 7 类图(柱状/条形算 1 类:柱状/条形/折线/散点/箱线/误差线/直方图/热图)× matplotlib + ggplot2;选库让用户拍板(先问 matplotlib/ggplot2/别的,得到答复才生成);配色取自公开色板(Okabe-Ito/ColorBrewer/viridis,非 AI 原创);真实数据或显式占位符(PAPER_PLACEHOLDER),绝不编看似真实的研究数据;确认前零落盘。"帮我画 KM 曲线""帮我画 ROC""帮我画森林图""帮我画 TikZ"走让路说明(v1.1+);"帮我编一组示例数据"走三段式拒绝(处 2 死线)。
---
# 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)。
No comments yet. Be the first to comment!