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

Art*_*rim 5 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)
Run Code Online (Sandbox Code Playgroud)

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

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

没有情节

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

太多的情节

我可以通过包装我的代码摆脱额外的显示器内部调用plt.ioffplt.ion,但它已经向我建议,这是一个黑客.在任何情况下,它都不会使matplotlib显示第一个单元格中的图.

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

ac2*_*c24 10

我添加了一些东西来让你的代码按照你的意愿工作

  • 添加%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)
Run Code Online (Sandbox Code Playgroud)

  • 请问“用 plt.show(fig) 调用替换您的 display(fig) 调用”背后的逻辑是什么? (2认同)