我正在使用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
。在运行此单元格后,图形不会渲染,我需要重新启动内核并再次运行此单元格。
为什么?
答案 0 :(得分:23)
您的命令顺序错误。在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])
答案 1 :(得分:4)
编辑:事实证明你实际上可以在jupyter上动态地改变后端。仍然在这里留下答案,因为我认为这是相关的,并解释了一些有时会出现的matplotlib魔法。
如source code所示,魔术命令正在调用matplotlib.pyplot.switch_backend(newbackend)
来更改后端。如matplotlib的docs中所述:
<强> matplotlib.pyplot.switch_backend(newbackend)强>
切换默认后端。此功能是实验性的,只能用于切换到图像后端。例如,如果您想要从交互式ipython会话中运行一堆PostScript脚本,则可能需要在运行它们之前切换到PS后端,以避免弹出一堆GUI窗口。如果您尝试以交互方式从一个GUI后端切换到另一个GUI后端,则会爆炸..
因此,每次切换后端时都必须重新启动内核,因为matplotlib在使用后切换后端有问题。
此问题主要是由于GUI后端的不同主循环之间不兼容。因为通常每个后端也在处理线程和用户输入,所以你不能并排运行Qt和Tkinter。所以这个限制会转移到jupyter。
答案 2 :(得分:0)
在Jupyter笔记本中,您必须在要运行的同一行中输入matplotlib笔记本。即使您输入“ inline”,然后输入“ notebook”,它仍然无法正常工作。它必须与要渲染的代码在同一行。