%matplotlib inline 必须在导入 matplotlib.pyplot 之后、绘图函数之前执行,且仅对当前 cell 生效;内核重启后需重运行;需配合 plt.show() 或末行无分号的绘图语句才能显示图像。

为什么 %matplotlib inline 画不出图?
不是代码写错了,而是执行顺序或内核状态不对。这个魔法命令必须在导入 matplotlib.pyplot 之后、调用 plt.plot() 等绘图函数之前执行,且只对当前 cell 生效——如果把它放在绘图代码后面,图就永远不会显示。
- 常见错误:把
%matplotlib inline放在 notebook 开头,但中间重启了内核却没重新运行这行 - 它不自动“全局生效”,每次 kernel restart 后都得重输一次(或放在第一个 import cell 里)
- 如果用了
%matplotlib widget或其他后端,再切回inline时需先执行%matplotlib inline,否则旧后端残留可能卡住输出
%matplotlib inline 和 %matplotlib widget 怎么选?
选哪个取决于你是否需要交互操作。前者生成静态 PNG,轻量、稳定、适合分享和导出;后者支持缩放、平移、hover 查值,但依赖额外安装、在某些远程环境(如 JupyterHub 或 VS Code 的远程 SSH)里可能加载失败或响应慢。
-
%matplotlib inline:默认已装好,兼容所有 notebook 环境,适合教学、文档、CI 渲染 -
%matplotlib widget:需pip install ipympl+jupyter nbextension enable --py --sys-prefix ipympl,且前端要支持 WebGL - 混用风险:两个命令不能共存,后执行的会覆盖前一个,且切换后已有 figure 不会自动重绘,得重新跑绘图 cell
为什么开了 %matplotlib inline 还是没输出?
大概率是漏掉了显式绘图触发。Jupyter 不会自动显示 plt 对象,必须有明确的“输出动作”——要么调用 plt.show(),要么让 cell 最后一行是 plot 对象(比如 plt.plot(...) 单独成行),或者用面向对象方式返回 ax 并让它成为 cell 的最后一行。
- 错例:
plt.plot([1,2,3]); plt.title("test")→ 分号抑制输出,图不显示 - 对例:
plt.plot([1,2,3])(末行无分号)或plt.show()(显式触发) - 注意:
plt.figure()本身不触发渲染,必须搭配绘图或plt.show()
在函数里用 %matplotlib inline 会怎样?
不会生效。魔法命令只能在 cell 的顶层执行,不能写在函数定义里,也不能用 exec() 或字符串拼接动态调用。
- 写成
def setup_plot(): %matplotlib inline→ 语法错误 - 想封装绘图逻辑?把
%matplotlib inline放在调用该函数的 cell 顶部即可 - 批量设置?用
IPython.get_ipython().run_line_magic('matplotlib', 'inline')(不推荐,可读性差且易出错)
plt.show() 或末行表达式、kernel 有没有悄悄重启过。











