前言¶
DSH 的理念是「一切皆插件」,数据分析类的活儿也可以做成面板,而不是只能在对话里来回贴结果。做科研时常见的路径是:把数据从 Excel 粘进 Python,用 scipy.stats 把候选分布一个个试一遍,再手动画直方图、调字体、改配色、按期刊栏宽出图。拟合、检验、排名、出图是四件事,却因为每换一个数据集就要重走一遍,最后花在调图上的时间往往比算的时间还多。
DistFit 把这条链路收进一个 GUI 左侧栏的独立面板。维护者是 stormx-u,仓库名 dsh-easydistfit(GitHub 上的项目名是 dsh-easydistfit,package.json 里的 name 是 dsh-distfit),MIT 协议,分类属于模型推理工具。它将 23 个分布族的拟合、K-S/A-D/CvM/χ² 四类拟合优度检验、AIC 排名、AI 解读和论文/PPT 模板出图串成一个流程,统计部分是纯 JavaScript 实现,不依赖 Python 和 SciPy。安装后除了面板,还注册了 distfit_fit 工具,对话里的助手可以直接调用。
安装与启用¶
先从本仓库安装,把 <本仓库路径> 换成 clone 下来的目录:
dsh plugin --profile web add link:"<本仓库路径>"
也可以在 GUI 的「插件」页里安装本地目录或仓库目录。安装后左侧栏出现「分布拟合」图标,点开即用。客户端改动刷新页面即可,Host 半边(工具、AI 路由)改动需要重启一次 DSH。
运行要求写在两处:README 里是 DSH >= 0.1.7-rc.1;package.json 的 dsh.engines.dsh 是 >=0.1.0。构建和测试需要 Node.js 24+。当前 package.json 中的版本是 0.6.0。
数据与拟合¶
支持两种输入:粘贴 CSV / TSV(首行为列名),或直接粘贴从 Excel 复制出的多列数据。多列各自独立拟合,空值和非数值自动剔除,同时按 IQR 规则剔除离群点,并在界面上给出剔除数量。
内置 23 个分布族:正态、Logistic、Laplace、Cauchy、均匀、对数正态、Gamma、Weibull、指数、Rayleigh、逆高斯、对数 Logistic、Lomax(Pareto II)、Burr XII、疲劳寿命(BS)、Nakagami、Maxwell、χ²、半正态、Beta、Gumbel、GEV、GPD。它们按「位置-尺度型 / 正偏寿命型 / 极值型 / 有界与其他」分组展示,可以勾选、一键全选,也可以只用「常用」六族。
参数估计走极大似然:先用矩估计做初值,再网格细化和数值最小化。估计结果直接写在表里,参数以 μ 位置=…, σ 尺度=… 的中文形式呈现,置信区间/分位数与经验分位数并列对照,方便判断估计是否可靠。
检验与排名¶
检验部分提供 K-S、A-D、CvM、χ² 四种,默认输出渐近 p 值,可以切换到「蒙特卡洛校准」模式(B=999 的参数自举,更准但更慢)。表里的 p 值可以按列勾选显示,避免列太多时看不清。
排名使用 AIC / BIC / ΔAIC / Akaike 权重,可以按 AIC、BIC 或 K-S p 值排序,结论列直接给出「接受 / 部分拒绝 / 拒绝」三档,减少自己判阈值的工作量。
图表¶
图表有四个页签:直方图加各分布 PDF 曲线、CDF 对比、P-P、Q-Q,全部用矢量 SVG 绘制。悬停显示该分箱的频数、密度和各分布密度值;图例可以点选高亮某一条曲线,曲线变多时自动折叠成「+N 条曲线」。拖动阈值或切换曲线都在浏览器本地完成,因为统计引擎是纯 JS,所以反馈是即时的。
AI 解读¶
每次算出结果后,面板把统计摘要交给 DSH 的模型通道,生成四段式解读,直接显示在 KPI 卡片下方:
- 数据说明了什么:中心与离散、偏斜方向、尾部与极值、取值范围、直方图是否单峰或有空档,以及这些特征对背后过程意味着什么(哪列更稳、哪里可能有异常批次、高端或低端风险)。每个判断都绑定摘要里的具体数字。
- 推荐分布与依据。
- 风险与注意事项。
- 下一步建议。
面板自己不保存任何密钥。POST /api/dsh-distfit/explain 进入 Host 后,用 DSH 的 llm 服务按「助手当前默认模型」发起一次短补全:优先用 agentDefaultModel,取不到时自动挑一个可用的 provider/model。所以只要当前 profile 里的模型通道可用,AI 解读就能用;换模型、换 provider 都跟随 DSH 设置,不需要改插件。模型调用发生在 Host 进程,浏览器侧拿不到凭据。可以手动点「重新分析」,解读也会写进导出的 Markdown 报告。
小样本提示¶
样本量 n < 15 时面板顶部出现提醒;3–4 参数的分布族(Beta / Burr / GPD 等)在排名里带 ⚠ 标记。这是为了避免小样本过拟合的结论被当成定论。
图表导出¶
图表卡片右上角点「导出图」进入导出对话框,左侧是所见即所得预览,右侧有三个页签:模板 / 样式 / AI 调整。
可用的画布尺寸包括 1280×720(16:9 幻灯片)、1600×900、1200×800、2400×1350、900×600 和自定义。样式上可以调字号(0.5×–5×)、线宽(0.3×–6×)、图例字号、位图倍率(1×/2×/3×),可以切换灰度图(按 BT.601 亮度换算,适合黑白印刷)、网格线、柱体描边、透明背景、坐标轴样式(L 形或四边全框)、图例位置(下方 / 右侧 / 不显示)以及图注标题。柱形图还可以单独调填充深浅(浅 / 中 / 深 / 空心)、柱间距(0–40 px)、柱体圆角(0–40 px)和柱体颜色;默认样式是「浅色 + 细描边 + 2 px 间隙 + 3 px 圆角」。
内置七套出图模板,点一下就能把字体、尺寸、字号线宽、坐标轴和图例一起换掉:
- 默认(彩色·网格)
- 中文期刊·双栏
- 英文期刊·单栏
- 学位论文
- 演示文稿·16:9
- 演示文稿·透明底
- 黑白打印
模板里的字号线宽会随画布宽度配套放大(1800 px 时约 3× 字号),缩到论文栏宽后依然清晰。当前样式可以存成自己的模板,存在 localStorage,可删除,下次一键复用。
导出格式支持 SVG(矢量,文字仍是文字)、PNG、JPG、PDF,文件名形如 distfit-木材-density-20261105-151543.pdf。暗色主题下导出的图会自动把浅色文字和参考线换成适合白底的深色。
预览即导出:对话框先把当前图表离屏渲染到 .df-export-stage 隐藏容器里(尺寸等于导出像素),再用 buildExportSvg 序列化同一份 SVG 生成预览,点导出时复用这份字符串,不会出现「预览好看、导出变小」。
AI 调整图表¶
在「AI 调整」页签里用一句话描述用途,例如「投中文核心期刊,双栏,灰度可打印,字号大一些」或「组会 PPT,深色底,字要大」。Host 半边的模型会把它翻译成一次样式补丁(可以同时指定预设加覆盖字段),应用到预览并给出中文说明。模型只能改样式字段,数据与统计结果不会被改动。
这条路走的是 POST /api/dsh-distfit/chart-style,请求 {request, context},返回 {ok, preset, style, notes, warnings}。Host 用字段白名单和范围把模型输出裁剪成合法补丁,模型不能注入任意 CSS/HTML。模型同样来自 DSH 的 llm 服务与助手默认模型,调用发生在 Host 半边。
典型用法¶
从面板走的完整流程可以是这样:
- 从 Excel 复制多列数据,粘进面板输入区,确认列名正确。
- 先用「常用」六族跑一遍,看 AIC 排序和 K-S p 的列勾选结果;结果不差再勾全选 23 族对比。
- 点开直方图 + PDF 页签,在图例里点选排名靠前的两个分布,看曲线贴合程度。
- 改图表样式:挑一个论文模板,微调字号和柱体颜色,在「AI 调整」里用一句话描述用途。
- 导出 PDF 或 SVG 用于论文,同时把排名表导成 CSV,或一键生成含 AI 解读的 Markdown 报告。
需要对话中断续做分析时,可以调用注册好的 distfit_fit 工具,让助手直接拟合数据并给出排名建议,宿主侧复用同一份统计引擎。
项目结构与自检¶
统计和界面代码的分工是:src/engine/ 是纯 JS 引擎(特殊函数、分布族、描述统计、检验、编排),浏览器与 Host 共用;src/host/ 承载 distfit_fit 工具、AI 解读和图表样式路由;src/client/ 是面板界面和导出逻辑。构建客户端产物用 esbuild:
node build.mjs # 生成 lib/client.js,改客户端代码后必须重新构建
npm test # 八套自检:引擎、端到端统计、Host 工具、AI 摘要、图表导出、图例、样式、客户端包冒烟
npm run test:chart # 只跑图表导出(灰度换算、文件名、PDF 结构)
适用场景与注意¶
适合科研场景下需要给一组数据找分布、出可发表图表的人,尤其是不想在 Python 脚本和绘图工具之间来回切换的环境。如果是纯建模任务,用 distfit_fit 工具即可;如果需要反复调图,面板那套模板和样式控件更合适。
几点注意:插件运行时使用的是当前 DSH 进程的权限,安装前应当检查源码和许可证(本项目是 MIT,仓库里也提供了 README 和 docs/DESIGN.md 可以审阅);浏览器侧不接触凭据,AI 解读的可用性取决于当前 profile 的模型通道。插件在社区目录的分类是模型推理,Star 数为 1,属于刚起步的项目,遇到问题建议直接到 GitHub 提 issue。升级插件版本后记得重启一次 DSH,Host 半边的代码在进程启动时加载,不重启的话 AI 卡片不会工作。
结尾¶
DistFit 的价值在于它把「拟合—检验—排名—解读—出图」这条科研里常见的链路装进了 DSH 面板,并且统计实现全部是纯 JavaScript,不引入 Python 依赖,对只跑 DSH 的环境比较友好。
- 目录页:https://www.skillhub.cn/plugins/stormx-u/dsh-easydistfit
- GitHub:https://github.com/stormx-u/dsh-easydistfit