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

del*_*onX 19 python matplotlib jupyter-notebook

我正在使用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')
Run Code Online (Sandbox Code Playgroud)

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

为什么?

Imp*_*est 26

您的命令顺序错误.在jupyter中导入pyplot之前应该设置后端.或者换句话说,在更改后端之后,需要再次导入pyplot.

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

在第一个细胞中:

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])
Run Code Online (Sandbox Code Playgroud)

在第二个细胞中:

%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])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • “在导入 pyplot 之前必须设置后端。” 我不相信这是真的。多年来,我一直使用“%matplotlib inline”*after* 导入pyplot,没有问题。我刚刚尝试了你的代码,将魔法移动到 pyplot 导入之后,它运行正确(我确实需要第二个“%matplotlib notebook”命令;谢谢你的提示)。另请注意,您不能在“%matplotlib notebook”之后添加评论。您可能会混淆“use()”命令的要求;请参阅此处的 #3:https://matplotlib.org/2.2.3/tutorials/introductory/usage.html#id3 (4认同)
  • 为什么这个答案基于完全错误的假设而得到如此多的支持?正如 Tom Loredo 所指出的,第二个“import matplotlib.pyplot as plt”什么也不做。这只是一些 python101 的东西(/sf/ask/30631261/) (3认同)
  • 我怀疑的部分原因是建议在设置/更改后端后重新导入 pyplot。在 Python 中导入已经导入的模块通常什么都不做(如果模块已经导入,`import` 通常只会绑定到已经导入的模块的名称;参见 http://effbot.org/zone/import-confusion.htm )。pyplot 是否有一些特殊的导入行为? (2认同)
  • @ImportanceOfBeingErnest 看来在导入 pyplot 之前不需要设置后端。至少在我的 jupyter 笔记本中是这样。 (2认同)

lol*_*pop 5

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

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

matplotlib.pyplot.switch_backend(newbackend)

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

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

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

另请参阅此问题:如何在 matplotlib / Python 中切换后端