← 返回 Skill 列表
extension
分类: 数据与分析无需 API Key

prism-style-plot

按 GraphPad Prism 的作图逻辑绘制投稿级科研图表。支持柱状图、箱线图、小提琴图、分组柱状图、XY 散点线图、生存曲线、饼图等 8 种数据表类型对应的图形。内置统计检验流程(t 检验、ANOVA + Tukey 事后比较、log-rank 等),自动完成显著性标注与精确 p 值输出。所有图表默认叠加个体数据点、使用色盲安全配色(Okabe-Ito)、L 形坐标轴、统一无衬线字体,符合 Nature/Cell 等期刊规范。用户只需上传实验数据并描述需求,即可获得可直接进论文的 PNG(300 dpi)+ PDF 矢量图及完整统计报告。 权限声明 本技能仅运行于本地环境,不联网、不需要任何外部 API 密钥或账号授权。 读取本地文件:读取用户提供的实验数据(CSV / Excel / 文本表格) 写入本地文件:在输出目录生成图片(PNG / PDF)和 Markdown 统计报告 安装 Python 依赖:在隔离虚拟环境中安装 matplotlib、seaborn、scipy、pandas、numpy 等绘图与统计库 执行本地脚本:运行技能内置的 Python 脚本生成图表 使用说明(可选但推荐) 上传或粘贴你的实验数据(CSV / Excel 均可) 用自然语言描述想要的图形类型,例如:「画一张柱状图,三组比较」「做一张生存曲线」 技能会自动识别数据表类型、选择合适的统计方法、生成 Prism 风格图表 输出包含:PNG 预览图、PDF 投稿矢量图、完整统计报告(含 Figure Legend)、精确 p 值

person作者: user_aabe55f8hubcommunity

verify — prism-style-plot 回归验证套件

技能自带的回归验证脚本,随技能包分发,换机器不丢验证能力。

失败如何被捕获(v2.10.0 审计确认)

本目录脚本不用 assert 关键字(改用 verify_common.report(name, ok) 打印 [PASS]/[FAIL] + 脚本内自维护的 fails 列表),因此 grep -c assert 会得到 0, 但失败仍能被run_all.py 正确捕获——每个脚本收尾都有 sys.exit(1 if fails else 0),verify13 则用裸 assert(异常即非零退出)。 实测 19 个脚本全部具备失败退出分支。

排查时可直接看 stdout 里的 [FAIL] 行,或跑单脚本后echo $?(0=过,1=挂)。

与 pytest 的分工(重要,避免重复劳动)

技能有两层验证,职责不同,不要互相重复:

| | tests/(pytest) | scripts/verify/(本目录) | |---|---|---| | 断言 | 主战场:统计正确性、输入防御、API 契约 | 只保留本层独有的断言 | | 产物 | 不产图(只断言) | 产出 PNG/PDF/报告供人工目视 | | 规模 | 单点、小数据 | 大设计矩阵(组数×样本量)、端到端串跑 | | 进程 | 单进程、共享 import | 每个脚本独立进程 | | 耗时 | 全量 ≈40s(--fast ≈32s;单主题文件 ≈8–14s) | 全量 ≈10min |

新增能力时的规则:

  1. 先在 tests/ 建断言(快、可定位、随包分发、可只跑相关文件);
  2. 只有当需要人工目视产物(图型外观、布局、标注位置)或要跑大设计矩阵时, 才在本目录加 verify 脚本;
  3. 不要在 verify 脚本里重复 pytest 已断言的内容。

重叠已消除(v2.12.x 重构):verify15 / verify16 原本与 pytest 的 test_plot_series / test_plot_forest_survival / test_plot_pairplot / test_plot_traces_raster / test_plot_canvas_size 存在断言重叠。现已将其中 纯逻辑断言全部移除,verify15/16 只保留两类内容:① 跑真实数据产出 PNG 供 人工目视;② 极少数 pytest 未覆盖的断言(series options 渲染、非法 error_type 防御、forest sort/value_fmt、recommend_shape 既有档位锁、traces y 刻度隐藏、 raster n_bins 分箱、raster t_range 裁剪)。两体系至此各守一边、零重叠: pytest = 逻辑断言,verify = 图产物 + 上述 unique 断言。

verify1–14 的真实分工(v2.12.x 审计修正):这些旧脚本的纯逻辑断言 (堆叠柱 / 水平柱 / 配对连线 / 误差线 5 口径 / CLD / 断轴 / 离群值 / RM one-way / 合并面板图等 API 契约)现已被 pytest 套件覆盖——它们保留的价值在三类 pytest 做不到的事:① 产出图供人工目视(所有脚本);② 大设计矩阵深度回归 (verify9/10/11:组数×样本量×交互形态,pytest 故意用小额数据);③ 少数视觉/ 端到端断言(zorder 层级 pytest 0 覆盖、长标签旋转、多 sheet Excel 端到端、 墙钟耗时护栏)。故 verify1–14 勿删,但可按 verify15/16 同法进一步去重—— 把其中与 pytest 完全重复的纯逻辑 check 删掉、只留出图 + 大矩阵 + 视觉断言(见 下表"建议"列)。

文件

| 文件 | 覆盖范围 | |---|---| | verify_common.py | 公共工具:模拟数据生成(make_groups)、重叠检查、PASS/FAIL 报告 | | verify1_column.py | Column 表三大图型:prism_bars / prism_boxplot / prism_violin + ttest/ANOVA 统计 | | verify2_others.py | 其他表型:Grouped 手写分组柱、Survival KM、XY 4PL/linear、Contingency | | verify3a_dot_size.py | 点径自适应 + 配色越界 + 非参数检验 | | verify3b_zorder_layout.py | 抖动布局 + zorder 图层 + 长标签旋转 | | verify3c_edge_cases.py | 统计边界场景 + 3 表型 + 报告补强 | | verify4_twoway_posthoc.py | Two-way ANOVA 事后比较:交互显著→简单效应 / 纯加性→主效应 | | verify5_grouped_annotated.py | Grouped 图上简单效应显著性标注(交互数据,48h 起效示例) | | verify6_figsize_recommend.py | 画布推荐(recommend_shape / recommend_figsize,表型默认 + 关键词覆盖) | | verify7_ylim_small.py | ylim<1 值域:细粒度步长 + bracket 数据最大值收集 | | verify8_ylim_small_allsigns.py | ylim<1 修复全图型推广(下限分级 / boxplot 边框 / 负值) | | verify9_deep_matrix.py | 析因设计矩阵深度回归(组数×样本量×交互形态) | | verify10_deep_others.py | 其他表型深度回归(含 figsize 关键词覆盖) | | verify11_deep_edge.py | 深度边界/性能(NaN/inf、空组、n=1、预检、向量化;含墙钟耗时断言,强制串行) | | verify12_combined_panel.py | v2.7.0 多数据集合并面板图 + 总报告(compose_panel_figure / build_master_report) | | verify13_multi_sheet.py | v2.7.2 单 Excel 多 sheet 读取 → 合并面板图(read_excel_sheets) | | verify14_v28_additions.py | v2.8.0 新增 API 回归(23 项):误差线 5 口径 + n=0/n=1 防御、log 轴守卫、零基线只在跨零时画、堆叠柱/水平柱/配对连线三个新图型、CLD 字母(两入口一致/链式 a·ab·b)、断轴、标签折行、离群值 Grubbs/ROUT、RM one-way(SS 分解闭合 + F 自洽)、投稿合规自检(不误报 + 真违规必检出)、XY 模型族(power 真实参数恢复)、7 种事后方案 + 效应量单调性、risk 表计数单调不增、布局缓存容量护栏。每个 check 用独立固定种子,可单独重跑任一检查 | | verify15_v29_additions.py | v2.9.0 新增 API 图产物回归(12 项):prism_series(默认阴影带 / n=1 退化 / options 渲染{show_points·show_n·自定义 colors·markers·legend} / y 轴收尾出图)、prism_forest(显式 HR / mean-diff / cox= 端到端 / sort+value_fmt 渲染)、prism_survival cumulative 3 组出图、prism_pairplot upper='mirror' 出图、recommend_shape 时间序列→wide + 既有档位锁。纯逻辑断言已移交给 pytest;本文件只出图 + 保留 pytest 未覆盖的 4 项断言(options/非法 error_type/sort/value_fmt/档位锁)。每个 check 用独立固定种子,可单独重跑任一检查 | | verify16_traces_raster.py | v2.9.2 新图型图产物回归(6 项):prism_traces(2D×6 出图 / groups 同组同色出图 / 自建 wide + y 刻度隐藏 + 显式比例尺)、prism_raster(PSTH 计数闭合 bin_size 出图 / n_bins 分箱出图 / t_range 裁剪)。纯逻辑断言(offset·spacing 公式、groups 着色、PSTH 计数闭合、trial 顺序、边界防御)已移交给 pytest;本文件只出图 + 保留 pytest 未覆盖的 3 项断言(y 刻度隐藏 / n_bins 路径 / t_range 裁剪)。每个 check 用独立固定种子,可单独重跑任一检查 | | build_deep_report.py | 把 verify9/10 的深度回归产物汇总成一个 HTML 报告 | | run_all.py | 一键回归入口(首选),跑固定 18 个 verify;无参数=全套,支持 --quick/--only <档位> | | run_full_suite.py | 备用入口(v2.7.6 明确):glob 自动发现 verify*.py/test*.py。仅当你另有自定义 verify 脚本、不想改 run_all.py 注册表时用——不保证执行顺序、不并行、不隔离耗时脚本,日常回归请用 run_all.py |

运行方式

# 遵循技能环境约定:先取 venv 解释器
PY=$(python ../../scripts/ensure_env.py 2>/dev/null || python scripts/ensure_env.py)

# 入口 1(首选):跑固定 18 个官方 verify(自动清理 output/)
$PY scripts/verify/run_all.py
$PY scripts/verify/run_all.py --keep-output   # 保留产物供人工复查

# 入口 2(备用,v2.3.1+):glob 自动发现当前目录所有 verify*.py + test*.py
# 仅当你有自定义 verify 脚本、不想改 run_all.py 注册表时使用
$PY scripts/verify/run_full_suite.py           # Markdown 表格输出
$PY scripts/verify/run_full_suite.py --json    # CI 友好 JSON 输出
$PY scripts/verify/run_full_suite.py /path/to  # 自定义 verify 目录

单跑一个用例(调试时):

$PY scripts/verify/verify1_column.py

输出

  • 产物(PNG/PDF/_report.md)写入 output/ 子目录,默认在回归全部通过后清理;
  • 退出码 0 = 全部 PASS,1 = 存在 FAIL;
  • 新增用例:命名 verifyN_*.py 放入本目录,并在 run_all.py 的 VERIFY_SCRIPTS 注册。

维护约定

  • 每次对 scripts/prism_theme.py 做改动,先 python -c "import prism_theme" 确认不崩, 再跑 run_all.py 确认无回归;
  • 回归失败立即还原改动,并记 status=reverted 到 learnings.jsonl。
  • output/ 不参与技能包分发:该目录是回归运行的副产物 (PNG/PDF/_report.md/html),体积可达 1.5M+,只应存在于本地。 交付/分享技能包前用 run_all.py(默认自动清理)或手动清空 output/, 不要把 output/ 内容带进技能包。run_all.py 默认行为已满足此约定; 如需在沙箱环境(回收站不可用)手动清理,直接删除 output/ 内文件即可。
  • 新增验证脚本必须带失败退出码:每个 verifyN_*.py 结尾必须 sys.exit(1 if fails else 0)(无 fails 列表时用 sys.exit(0 if ok else 1))—— run_all.py 靠子进程退出码判定 PASS/FAIL,缺退出码会让脚本内 FAIL 被误报为 PASS("假绿",v2.1.1 教训)。