如何在Jupyter选项卡小部件中显示matplotlib图?

时间:2018-06-13 16:31:25

标签: python matplotlib jupyter-notebook ipywidgets

我无法在Jupyter标签小部件中显示情节。请考虑以下代码段:

import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np

out1 = widgets.Output()
out2 = widgets.Output()
data1 = pd.DataFrame(np.random.normal(size = 50))
data2 = pd.DataFrame(np.random.normal(size = 100))

with out1:
    fig1, axes1 = plt.subplots()
    data1.hist(ax = axes1)
    display(fig1)

with out2:
    fig2, axes2 = plt.subplots()
    data2.hist(ax = axes2)
    display(fig2)

tab = widgets.Tab(children = [out1, out2])
tab.set_title(0, 'First')
tab.set_title(1, 'Second')
display(tab)

(我在虚拟环境中的Ubuntu 16.04上运行Python 3.5.2,Jupyter 4.4.0,ipywidgets 7.2.1。)

如果我将此代码放在笔记本的第一行并运行它,我会看到一个带有两个选项卡的选项卡小部件,每个选项卡都显示一个字符串,但不显示该情节:

No plots

如果我第二次运行它,或者如果我在第二个单元格中导入matplotlib之后重新运行它,我会看到一个标签小部件,每个标签上有一个绘图,但我得到了两个图表在标签外第二次显示。

Too many plots

我可以通过将代码包含在plt.ioffplt.ion的调用中来摆脱其他显示,但是it has been suggested to me这是一个黑客攻击。在任何情况下,它都不会使matplotlib显示第一个单元格中的图。

问题:在标签内显示图表的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

我添加了一些方法来使您的代码按您的意愿工作

  • 在单元格顶部添加%matplotlib inline
  • 将您的display(fig)通话替换为plt.show(fig)通话。
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import ipywidgets as widgets
import numpy as np

out1 = widgets.Output()
out2 = widgets.Output()
data1 = pd.DataFrame(np.random.normal(size = 50))
data2 = pd.DataFrame(np.random.normal(size = 100))

tab = widgets.Tab(children = [out1, out2])
tab.set_title(0, 'First')
tab.set_title(1, 'Second')
display(tab)

with out1:
    fig1, axes1 = plt.subplots()
    data1.hist(ax = axes1)
    plt.show(fig1)

with out2:
    fig2, axes2 = plt.subplots()
    data2.hist(ax = axes2)
    plt.show(fig2)

答案 1 :(得分:-1)

{p3}中上述答案中的

plt.show(fig)已被弃用:

In [1]: import matplotlib.pyplot as plt                                                                                                                                   

In [2]: fig = plt.figure()                                                                                                                                                

In [3]: plt.show(fig)                                                                                                                                                     
<ipython-input-3-d1fd62acb551>:1: MatplotlibDeprecationWarning: Passing the 
block parameter of show() positionally is deprecated since Matplotlib 3.1; the 
parameter will become keyword-only in 3.3.
    plt.show(fig)

plt.show(block=True)(或plt.show(block=False))是仅关键字调用。

答案 2 :(得分:-2)

从IPython.display导入显示

相关问题