web-dev-qa-db-ja.com

Jupyterタブウィジェットでmatplotlibプロットを表示する方法

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)

(Python 3.5.2、Jupyter 4.4.0、ipywidgets 7.2.1を仮想環境内のUbuntu 16.04で実行しています。)

このコードをノートブックの最初の行に配置して実行すると、2つのタブを持つタブウィジェットが表示されます。各タブには文字列が表示されますが、プロットは表示されません。

No plots

2回目に実行した場合、またはmatplotlibのインポート後にすべてを2番目のセルに入れて再実行した場合、各タブに1つのプロットを持つタブウィジェットが表示されますが、2つのプロットが表示されますタブの外側でもう一度。

Too many plots

plt.ioffplt.ionへの呼び出しの内側にコードをラップすることで、追加のディスプレイを取り除くことができますが、 これは私に示唆されています これはハックであるとしています。また、いずれの場合も、matplotlibが最初のセルにプロットを表示しません。

質問:タブ内にプロットを表示する適切な方法は何ですか?

私はあなたが望むようにあなたのコードを機能させるためにいくつかのものを追加しました

  • セルの上部に_%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)
_
10
ac24