%matplotlib inline 生成静态 PNG 图像,无交互能力;启用交互需改用 %matplotlib widget(ipympl)或 Plotly/Bokeh 等支持 Web 渲染的库,并正确配置渲染器与前端扩展。

默认不启用交互,必须显式配置后端或库才能让图表响应缩放、拖拽、悬停等操作。
为什么%matplotlib inline画出来的图不能动
因为%matplotlib inline把图表渲染成静态 PNG 图像,完全丢弃了 JavaScript 交互能力。它只适合导出报告或快速预览,不是交互场景的解法。
- 交互需要前端运行 JS 逻辑,依赖浏览器环境和 widget 通信机制
- 真正起作用的是
%matplotlib widget(ipympl)或 Plotly/Bokeh 这类原生支持 Web 渲染的库 - 在 JupyterLab 中,
%matplotlib inline是默认行为;不改就永远静止
用 ipympl 启用 Matplotlib 原生交互
这是最轻量、兼容性最好的方案,尤其适合已有 Matplotlib 代码想快速加交互的场景。
- 先装依赖:
pip install ipympl,然后执行jupyter nbextension enable --py --sys-prefix ipympl - 在 Notebook 第一个代码单元写:
%matplotlib widget(注意不是 inline) - 后续所有
plt.plot()、plt.scatter()都自动带缩放、平移、导出按钮 - JupyterLab 用户需确认已安装
@jupyter-widgets/jupyterlab-manager插件,否则白屏
Plotly 交互更丰富但要注意渲染器设置
Plotly 默认生成 HTML+JS,但 Jupyter 环境里容易因渲染器未设对而只显示空框或报错 ValueError: Mime type rendering not supported。
- 安装后必须手动指定渲染器:
import plotly.io as pio; pio.renderers.default = 'notebook' - 推荐优先用
plotly.express快速起步,比如px.line(df, x='t', y='value') - 若用
plotly.graph_objects手动构建,记得最后调fig.show(),不是plt.show() - 导出为独立 HTML 文件时,用
fig.write_html("out.html"),别依赖 notebook 渲染器
别忽略内核与扩展的匹配问题
交互功能本质是 Python 内核 ↔ 前端 JS ↔ 浏览器三端协作,任一环节断开就会失效——这比语法错误更难排查。
- 每次升级 JupyterLab 或 ipywidgets 后,重跑
jupyter nbextension enable类命令 - 在 JupyterLab 中检查左下角状态栏是否显示 “Widgets are enabled”;没显示就说明 widget 扩展没生效
- Qgrid/bqplot/pivottablejs 这类工具都依赖
ipywidgets,但它们各自还要单独启用对应 nbextension - conda 用户慎用
conda install装 ipympl/plotly,有时会拉低版本导致 JS 不兼容,优先用 pip


















