【问题标题】:Using %matplotlib notebook after %matplotlib inline in Jupyter Notebook doesn't work在 Jupyter Notebook 中的 %matplotlib inline 之后使用 %matplotlib notebook 不起作用
【发布时间】:2017-09-18 14:16:03
【问题描述】:

我正在使用 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。运行此单元后,图形不会呈现,我需要重新启动内核并再次运行此单元。

为什么?

【问题讨论】:

  • 加载和使用库更改/存储更多类和变量,使用复制+重命名模块类作为外部模块。单次导入单次使用...

标签: python matplotlib jupyter-notebook


【解决方案1】:

你只是有错误的命令顺序。在 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])

【讨论】:

  • "在导入 pyplot 之前必须设置后端。"我不相信那是真的。多年来,我一直使用 "%matplotlib inline" 导入 pyplot 之后,没有问题。我刚刚尝试了您的代码,将魔法移动到 pyplot 导入之后,它运行正确(我确实需要第二个“%matplotlib notebook”命令;感谢您的提示)。另请注意,您不能在“%matplotlib notebook”之后发表评论。您可能会混淆“use()”命令的要求;在这里看到#3:matplotlib.org/2.2.3/tutorials/introductory/usage.html#id3
  • 感谢您的评论。通过魔术命令更改后端并不可靠,但您可以通过在 pyplot 导入之前设置后端来规避这种情况。如果你从来没有遇到过任何逆向问题,那可能是幸运的。我修改了上面的句子以更准确。
  • 我持怀疑态度的部分原因是建议在设置/更改后端后重新导入 pyplot。在 Python 中导入已经导入的模块通常什么都不做(如果模块已经导入,import 通常只对已经导入的模块进行名称绑定;请参阅effbot.org/zone/import-confusion.htm)。 pyplot 是否有一些特殊的导入行为?
  • 当这个答案基于完全错误的假设时,为什么会有如此多的赞成票?正如 Tom Loredo 所说,第二个 import matplotlib.pyplot as plt 什么都不做。这只是一些 python101 的东西(stackoverflow.com/questions/437589/…)
  • @ImportanceOfBeingErnest 在导入pyplot之前似乎不需要设置后端。至少在我的 jupyter 笔记本中。
【解决方案2】:

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

source code 中所见,魔术命令正在调用matplotlib.pyplot.switch_backend(newbackend) 来更改后端。如matplotlib的docs中所述:

ma​​tplotlib.pyplot.switch_backend(newbackend)

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

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

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

另请参阅此问题:How to switch backends in matplotlib / Python

【讨论】:

  • 我不认为这是真的(不再)。请参阅我的答案,可以像往常一样通过调用魔术命令轻松切换后端。
【解决方案3】:

在 Jupyter notebook 中,您必须在要运行的那一行输入 matplotlib notebook。即使您输入“inline”,然后输入“notebook”,它仍然不起作用。它必须与您要呈现的代码在同一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2018-06-23
    • 2017-05-05
    • 2020-11-01
    • 2019-02-04
    • 2018-04-05
    • 2016-08-16
    相关资源
    最近更新 更多