pyecharts funnel漏斗图需传二维列表或元组,如[('a',100),('b',65)];标签重叠用gap和label_opts调整;百分比需手动计算并设置formatter;导出空白多因js加载失败,建议用page.render或svg渲染。

Pyecharts Funnel 画漏斗图,数据必须是二维列表或元组
直接传 dict 或 pandas DataFrame 会报错:TypeError: unhashable type: 'list'——因为 Funnel 内部默认把第一列当标签、第二列当数值,只认「可迭代的二元结构」。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
list(zip(labels, values))转成[('A', 100), ('B', 65), ('C', 22)]这种格式最稳 - 别用
dict.items()后直接传,虽然也是二元,但 Pyecharts 0.9+ 对其支持不一致,容易顺序错乱 - 如果数据来自 CSV 或 DataFrame,先用
df[['stage', 'count']].values.tolist()拿二维列表,别偷懒用df.to_dict('records')
漏斗图标签重叠?调 label_opts 和 gap 才有效
默认情况下,阶段多、文字长时,Funnel 的标签会堆在一起甚至覆盖图形,不是字体小的问题,而是布局没预留空间。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 加
gap=2(单位像素)扩大各层间距,值太小没用,建议从2试到8 - 标签位置统一用
label_opts=opts.LabelOpts(position="inside"),避免内外混排导致错位 - 禁用自动旋转:显式写
rotate=0,否则中文标签可能斜着挤进窄层里,反而更难读
Funnel 不显示百分比?得手动算并塞进数据里
Pyecharts 的 Funnel 默认只渲染原始数值,不会自动计算转化率或百分比——它压根不知道你想要“上一步到这一步”的比率还是“占首步的比例”。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 转化率通常指「当前步骤 / 上一步骤」,比如注册→登录→下单,需自己用 numpy 或纯 Python 算出每层占比,再替换成新数据
- 若想显示「占第一步的百分比」,更简单:用
[v / data[0][1] * 100 for v in values],然后round(..., 1)控制小数位 - 注意:改完数值后,
series_name别写成 "转化率" 就完事,要在label_opts里加formatter="{b}: {c}%",否则仍显示原始数字
导出 HTML 后漏斗图空白?检查是否漏了 render() 或 JS 资源路径
本地跑 .render() 没问题,但放到服务器或发给别人看时一片白,大概率是 JS 文件没加载成功,不是代码逻辑问题。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先用
page.render("report.html")配合Page,它会自动内联 JS,避开 CDN 加载失败 - 如果坚持单图,加
init_opts=opts.InitOpts(renderer="svg"),SVG 渲染不依赖外部 JS,适合离线场景 - 确认没误删
pyecharts.globals.CurrentConfig.ONLINE_HOST相关设置;改过 CDN 地址的,要确保该域名可访问(尤其内网环境)
漏斗图看着简单,但数据结构、标签布局、百分比语义、导出路径这四块,任一环节卡住都会让图“看起来没画出来”。尤其多人协作时,别假设对方知道你要的是“占首步比例”还是“逐级留存率”,数据进图前先打个日志看看 shape 和 type。










