python中无内置鱼骨图功能,需用matplotlib手工绘制主骨、大刺、小刺及标签,或避免使用已停更且不兼容的第三方包,推荐导出结构化数据至excel等专业工具生成。

鱼骨图在 Python 根因分析中不直接存在
Python 没有内置的“鱼骨图”数据结构或分析函数,fishbone、ishikawa 这类名字也不会出现在标准库或主流科学计算栈里。所谓“Python 做鱼骨图”,本质是用绘图工具(如 matplotlib 或 plotly)手工绘制因果分支图,或借助第三方小众包做有限封装——但这些包普遍维护停滞、文档缺失、不兼容新版本。
用 matplotlib 手动画鱼骨图的关键三步
核心思路是:把鱼骨图拆成「主骨(水平线)+ 大刺(斜线)+ 小刺(更短斜线)+ 文字标签」,全部用 ax.plot() 和 ax.text() 控制坐标拼出来。不是调一个函数就能出图,得自己算角度和偏移。
- 主骨用
ax.plot([x0, x1], [y0, y0], 'k-', lw=2)画一条横线 - 每根大刺对应一个原因类别(如“人、机、料、法、环”),需手动计算起点(在主骨上)、长度、角度;常用
np.cos()/np.sin()算坐标偏移 - 小刺和文字必须逐个定位,
ax.text(x, y, "培训不足", ha='center', va='center')的x、y得靠试错或公式推导,稍一错位就重叠或飞出画布
别碰 py Ishikawa 和 fishbone-diagram 这类包
搜到的几个标榜“鱼骨图”的 PyPI 包,实际问题很具体:
-
py Ishikawa依赖已删库的graphviz旧版,pip install直接报ModuleNotFoundError: No module named 'graphviz.backend' -
fishbone-diagram最后更新是 2019 年,不支持matplotlib >= 3.8,调用ax.set_axis_off()会触发AttributeError: 'Axes' object has no attribute 'set_axis_off' - 所有类似包都不处理中文标签乱码——默认字体不支持中文,加
plt.rcParams['font.sans-serif'] = ['SimHei']后,箭头位置又会因字体度量变化而偏移
真正省事的做法:导出数据,交给专业工具
根因分析本身是逻辑活动,画图只是呈现手段。与其卡在 Python 绘图细节里,不如把归因结果整理成结构化数据,转给更擅长可视化的地方:
立即学习“Python免费学习笔记(深入)”;
- 用
pandas.DataFrame存原因分类、子原因、证据条目,保存为root_causes.csv - 用 Excel / Google Sheets 插入 SmartArt 鱼骨图,粘贴分类数据,拖拽调整即可,支持中文、自动避让、可导出高清图
- 若需嵌入报告,用
plotly.express画交互式树状图(px.treemap())或桑基图(px.sunburst()),比鱼骨图更能体现多层归因权重
鱼骨图的“手动画感”恰恰是它的陷阱——它暗示线性、静态、穷尽式归因,而真实系统故障往往有循环依赖、时序耦合、隐藏状态。把精力花在厘清 error_log 时间线、复现 docker-compose.yml 环境、比对 git diff 变更点上,比调通一根 37° 斜刺的 ax.plot() 参数重要得多。










