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

问题描述 投票:0回答:4

我正在使用 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
4个回答
53
投票

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


6
投票

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

神奇的命令,如源代码中所示,正在调用

matplotlib.pyplot.switch_backend(newbackend)
来更改后端。正如 matplotlib 的 docs 中所述:

matplotlib.pyplot.switch_backend(新后端)

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

所以每次切换后端你真的必须重新启动内核,因为matplotlib在使用后切换后端有问题。

这个问题主要是由于GUI后端不同主循环之间不兼容造成的。因为通常每个后端还处理线程和用户输入,所以您无法并行运行 Qt 和 Tkinter。因此,该限制将转移到 jupyter。

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


0
投票

2024 年 JupyterLab 更新

当前接受的答案在 JupyterLab v4.2 中对我不起作用。自从几年前写下以来,事情似乎已经发生了变化。

我给出了我发现目前有效的方法:

  • %matplotlib <backend>
    魔法命令就足够了;
  • 切换回
    close
    后端时必须
    inline
    图。

这是一个最小的例子:

第一个单元格

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 7, 100)
plt.plot(np.sin(x))

enter image description here

第二个牢房

%matplotlib widget

plt.plot(np.sin(2*x))
plt.show()

enter image description here

第三个单元格

%matplotlib inline

plt.close()
plt.plot(np.sin(3*x))

enter image description here

重要

如果我在

第三个单元格
中注释np.close()命令,则不会生成新的绘图。相反,第二个单元会使用第三个单元的输出进行更新,如下所示。

enter image description here


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.