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

时间:2017-04-21 14:18: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')

之后我有第二个单元格,代码相同,只有%matplotlib inline更改为%matplotlib notebook。在运行此单元格后,图形不会渲染,我需要重新启动内核并再次运行此单元格。

为什么?

3 个答案:

答案 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])

enter image description here

答案 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。

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

答案 2 :(得分:0)

在Jupyter笔记本中,您必须在要运行的同一行中输入matplotlib笔记本。即使您输入“ inline”,然后输入“ notebook”,它仍然无法正常工作。它必须与要渲染的代码在同一行。