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——按图类 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 的任何一条。仍守两条:① 选库让用户拍板(先问"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。
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: <描述>——
df = pd.read_csv("your_data.csv") # PAPER_PLACEHOLDER: 替换为您的数据文件路径
x = df["treatment_group"] # PAPER_PLACEHOLDER: 替换为您的分组列名
y = df["measurement"] # PAPER_PLACEHOLDER: 替换为您的测量值列名
顶部声明模板(二选一,代码文件第一行)
用真实数据时:
# 基于用户提供的真实数据(来源:<文件名/粘贴文本>)
用占位符数据时:
# 占位数据、需替换为真实数据。绝不编造看似真实的研究数据。
主流程(三步、一个确认停点)
第 1 步 · 读输入 + 选库问询(不停)
做三件事:
- 读上游:从
/paper-figure主流程交棒读入"图类决定 + 配色决定 + 数据/论断";若独立调用,问用户图类与目标工具库。 - 问库:先问"matplotlib / ggplot2 / 别的?"(摆事实不推荐、用户拍板——不变①);得到答复才进第 2 步。若用户从 figure 交棒已选库,则跳过此问。
- 数据格式判定:检测用户是否贴了数据(CSV 文件路径 / Markdown 表格 / JSON / 粘贴表格文本);无数据则进占位符路径。用户口述数据(无文件/表格粘贴)同样进占位符路径。
完成后不停,直接进第 2 步。
第 2 步 · 生成代码(停检查点)
按图类 + 工具库生成代码(仅 v1.0 P0 范围;P1/P2 越界时让路说明、不在 v1.0 生成):
- 按图类 x 工具库查
references/P0图类代码模板.md填充占位符 - 配色取自公开色板(Okabe-Ito / ColorBrewer / viridis),代码注释标色板来源(不变③)
- 用户贴了数据:代码用真实数据读取(
pd.read_csv("实际文件")/ 内嵌粘贴数据),顶部声明"基于用户提供的真实数据(来源:<文件名/粘贴文本>)" - 用户没贴或仅口述:代码用占位符
# PAPER_PLACEHOLDER,顶部声明"占位数据、需替换为真实数据" - 每段代码注释指明对应数据/论断来源、配色取自哪个色板(不变③)
P1/P2 越界处理:用户要的图类不在 v1.0 P0 范围 → 不生成代码,给出让路说明(见「越界转化」表)。
完整呈现代码后停下:
⏸ 等待确认:绘图代码(<图类> · <工具库>)
(回复"落盘"归档为 .py/.R 文件;或指出要改的参数 / 配色 / 图类)
确认前零文件落盘——与 paper-init / outline / logic / abstract「确认前零创建」同源。
第 3 步 · 落盘 + 自检 + 留痕 + 交棒
用户确认后做四件事:
- 探测落点:检测到标准科研目录(有
manuscript/)→ 落manuscript/绘图代码_<图类>.py(matplotlib)或manuscript/绘图代码_<图类>.R(ggplot2);否则落当前目录并提示可用/paper-init。 - 写代码文件 + 自检:纯文本写入。自检两道:
grep -iE "p\s*<\s*0\.|N\s*=\s*[0-9]+"期望 0 命中(防止误编看似真实的统计数据——处 2 死线防线)- 视觉检查
# PAPER_PLACEHOLDER标记完整:所有需用户替换的位置都已标记、无遗漏
- 写留痕:往
.paper/追加一条**成句生成级(重)**使用记录(见「留痕」)。 - 交棒:提示下一步——"代码归档了。你可以:① 替换数据后运行;② 改参数后重生成;③ 用
/paper-logic检查论证链、/paper-abstract提炼摘要。"
自检规则
代码落盘前必跑两道自检:
统计数据误编检查(硬约束):
grep -iE "p\s*<\s*0\.|N\s*=\s*[0-9]+" <代码文件>期望 0 命中。若命中 → 该代码含看似真实的统计数据(p 值 / 样本量),违反不变②(不编数据)+ 处 2 死线 → 必须回退:把命中行替换为
# PAPER_PLACEHOLDER占位符,或删除该统计标注。例如N = 30→# PAPER_PLACEHOLDER: 替换为您的样本量。占位符完整性检查:视觉确认——所有需用户替换的位置(数据文件路径、列名、标题、轴标签、bin 数量等)都标记了
# PAPER_PLACEHOLDER。代码中不应出现your_data.csv等通用占位同时缺失PAPER_PLACEHOLDER标记的情况。
留痕(成句生成级·重)
往 .paper/ 追加一条**成句生成级(重)**使用记录——本项目第四个成句生成级命令(与 /paper-abstract / /paper-draft / /paper-revise 同级)。纯文件追加、不依赖任何写入器。格式:
## <日期时间> · 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)。