Plotly 是 Jupyter Notebook 中交互式图表的首选方案,因其开箱即用、兼容性好;需正确配置渲染器(如 iframe)、区分 px(快速探索)与 go(精细控制)、导出 HTML 时内联 JS 资源,并明确其仅负责渲染而非自动回传交互数据。

Plotly 是目前在 Jupyter Notebook 里做交互式图表最省心、兼容性最好、开箱即用的选择。其他方案(如 bqplot、pivottablejs)要么依赖额外前端扩展,要么功能边界明确(比如只做透视表),而 Plotly 只需安装 + 一行配置,就能直接响应缩放、悬停、图例开关、导出等操作。
为什么默认不显示交互?先配好 renderer
很多人跑完 fig.show() 却看到空白或弹出新浏览器窗口——根本原因是没设对渲染后端。
-
pio.renderers.default = 'notebook'是旧版写法,已弃用;2026 年主流环境(JupyterLab ≥ 4.0 / Notebook ≥ 7.0)默认用iframe渲染,但需确认是否启用 - 执行
import plotly.io as pio; pio.renderers查看当前可用 renderer,常见值有notebook(已废弃)、iframe、colab、vscode - 如果
fig.show()弹窗或报错ValueError: No renderer available,运行pio.renderers.default = 'iframe'再试 - JupyterLab 用户建议装插件:
jupyter labextension install jupyterlab-plotly(否则可能只显示静态快照)
px.scatter() 和 go.Figure() 怎么选?
plotly.express(px)适合快速探索,plotly.graph_objects(go)适合精细控制。两者都能交互,但底层行为不同:
-
px自动生成 hover 信息、图例、坐标轴标签,且默认开启所有交互(缩放/平移/框选/悬停),适合 EDA 阶段 -
go.Figure()不自动推断语义,hovertemplate 需手动写,但能精确控制 trace 的 visible、opacity、selection 等状态,适合仪表盘或联动场景 - 混用没问题:可以用
px.scatter(...).update_layout(...)做轻量定制;也可以用go.Scatter()手动加 trace 后再调fig.update_xaxes(rangeslider=True)开范围滑块 - 注意:
px返回的Figure对象和go.Figure()类型一致,可无缝调用相同方法
导出 HTML 时交互失效?检查 write_html 参数
用 fig.write_html("out.html") 生成的文件打不开交互,大概率是 JS 资源没内联或路径不对。
- 默认行为是外链 CDN,若离线打开或服务器未配 CORS,JS 加载失败 → 图表变静态
- 强制内联所有资源:
fig.write_html("out.html", include_plotlyjs='cdn')(在线)或include_plotlyjs='require'(需提前npm install plotly.js) - 最稳妥的是打包成单文件:
fig.write_html("out.html", include_plotlyjs='standalone'),体积大但 100% 离线可用 - 别用
to_html()直接拼字符串,它不处理 JS 依赖,容易漏掉plotly.min.js
用 pivottablejs 做交互透视表要注意什么?
它不是图表库,而是基于 PivotTable.js 的拖拽式数据透视 UI,和 Plotly 定位不同,但常被误当作“交互图表”方案。
-
pivot_ui(df)必须在 notebook cell 最后一行调用(不能赋值给变量再 print),否则不渲染 - 输出是独立 HTML 页面,嵌入 notebook 靠 iframe,因此无法和其它 cell 的 Python 变量联动(比如点击某行后触发后续计算)
- 若数据含中文列名或特殊字符,需提前用
df.columns = df.columns.astype(str)统一转 str,否则 pivot_ui 报TypeError: Object of type bytes is not JSON serializable - 它不支持服务端 session,每次刷新页面都重置状态,不适合做持久化分析面板
dash 或 ipywidgets + 回调函数实现,Plotly 本身只管渲染和事件捕获。别指望一个 fig.show() 就自动把交互结果喂回 Python 变量。


















