在 Jupyter 笔记本中内联 %matplotlib 后使用 %matplotlib 笔记本不起作用

新手上路,请多包涵

我正在使用 Jupyter Notebook 绘制饼图。

在我的代码的 第一个单元格 中,我有一个神奇的命令 %matplotlib inline 在这个神奇的命令之后我运行我的代码,一切正常,我的图形呈现。

但是在 第二个单元格 中,当我设置 %matplotlib notebook 进行交互式绘图时,我的图形在运行第二个单元格后不会呈现。

我需要重新启动内核并再次使用 %matplotlib notebook 运行单元,并且在此之前无法运行 %matplotlib inline 命令。

这是我的 第一个单元格 的代码 %matplotlib inline ,它呈现得很好:

 import matplotlib.pyplot as plt

%matplotlib inline

labels = "No", "Yes"
sizes = [100, 50]

fig, ax = plt.subplots(figsize=(6, 6))

_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
             shadow=False, startangle=90)

ax.axis('equal')

之后我有 第二个具有相同代码的单元格,只是 %matplotlib inline 更改为 %matplotlib notebook 。运行此单元后图形不会呈现,我需要重新启动内核并再次运行此单元。

为什么?

原文由 PeterB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您的命令顺序错误。在 jupyter 中导入 pyplot 之前应该设置后端。或者换句话说,换了后台之后,需要重新导入pyplot。

因此在导入 pyplot 之前调用 %matplotlib ...

在第一个单元格中:

 %matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

在第二个单元格中:

 %matplotlib notebook
#calling it a second time may prevent some graphics errors
%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

原文由 ImportanceOfBeingErnest 发布,翻译遵循 CC BY-SA 4.0 许可协议

编辑:事实证明,您实际上可以在 jupyter 上动态更改后端。仍然在这里留下答案,因为我认为它是相关的,并解释了一些有时会突然出现的 matplotlib 魔法。

源代码 中所示,魔术命令正在调用 matplotlib.pyplot.switch_backend(newbackend) 来更改后端。正如 matplotlib 的 文档 中所述:

matplotlib.pyplot.switch_backend(新后端)

切换默认后端。此功能是实验性的,预计只能切换到图像后端。例如,如果您想从交互式 ipython 会话中运行一堆 PostScript 脚本,您可能希望在运行它们之前切换到 PS 后端,以避免弹出一堆 GUI 窗口。如果你试图以交互方式从一个 GUI 后端切换到另一个,你会爆炸..

所以每次切换后端真的要重启内核,因为matplotlib用完后切换后端有问题。

这个问题主要是由于 GUI 后端的不同主循环之间的不兼容。因为通常每个后端也负责线程和用户输入,所以您不能同时运行 Qt 和 Tkinter。因此,这种限制会延续到 jupyter。

另见这个问题: How to switch backends in matplotlib / Python

原文由 unddoch 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题