paper-plot

Paper 绘图代码生成命令(内建于 paper-figure,可独立调用)。当用户要生成绘图代码、plot 代码、画图代码、matplotlib 代码、ggplot2 代码、帮我生成图表代码、帮我写画图脚本、生成柱状图代码、散点图代码、折线图代码、箱线图代码、误差线图代码、直方图代码、热图代码,或说"帮我画个图""帮我写段代码画柱状图""给我一个 matplotlib 脚本"也触发——即使用户只

SKILL.md

GitHub

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 步 · 读输入 + 选库问询(不停)

做三件事:

  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 填充占位符
  • 配色取自公开色板(Okabe-Ito / ColorBrewer / viridis),代码注释标色板来源(不变③)
  • 用户贴了数据:代码用真实数据读取(pd.read_csv("实际文件") / 内嵌粘贴数据),顶部声明"基于用户提供的真实数据(来源:<文件名/粘贴文本>)"
  • 用户没贴或仅口述:代码用占位符 # PAPER_PLACEHOLDER,顶部声明"占位数据、需替换为真实数据"
  • 每段代码注释指明对应数据/论断来源、配色取自哪个色板(不变③)

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

完整呈现代码后停下:

⏸ 等待确认:绘图代码(<图类> · <工具库>)
(回复"落盘"归档为 .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. 统计数据误编检查(硬约束):

    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 同级)。纯文件追加、不依赖任何写入器。格式:

## <日期时间> · 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)。