我正在使用 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
。运行此单元后,图不会呈现,我需要重新启动内核并再次运行此单元。
为什么?
您只是命令顺序错误。在 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])
编辑:事实证明,您实际上可以在 jupyter 上动态更改后端。仍然将答案留在这里,因为我认为它是相关的,并解释了一些有时会弹出的 matplotlib 魔法。
神奇的命令,如源代码中所示,正在调用
matplotlib.pyplot.switch_backend(newbackend)
来更改后端。正如 matplotlib 的 docs 中所述:
matplotlib.pyplot.switch_backend(新后端)
切换默认后端。此功能是实验性的,预计仅适用于切换到图像后端。例如,如果您有一堆 PostScript 脚本想要从交互式 ipython 会话运行,您可能需要在运行它们之前切换到 PS 后端,以避免弹出一堆 GUI 窗口。如果您尝试以交互方式从一个 GUI 后端切换到另一个 GUI 后端,您将会爆炸..
所以每次切换后端你真的必须重新启动内核,因为matplotlib在使用后切换后端有问题。
这个问题主要是由于GUI后端不同主循环之间不兼容造成的。因为通常每个后端还处理线程和用户输入,所以您无法并行运行 Qt 和 Tkinter。因此,该限制将转移到 jupyter。
当前接受的答案在 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))
%matplotlib widget
plt.plot(np.sin(2*x))
plt.show()
%matplotlib inline
plt.close()
plt.plot(np.sin(3*x))
如果我在
第三个单元格中注释
np.close()
命令,则不会生成新的绘图。相反,第二个单元会使用第三个单元的输出进行更新,如下所示。
在 Jupyter Notebook 中,您必须在与要运行的 Notebook 相同的行中输入 matplotlib Notebook。即使你输入“inline”然后再输入“notebook”,它仍然不起作用。它必须与您要呈现的代码位于同一行。