ちょこちょこ変えてますが基本的にUsing Interactの日本語訳です。なお、nbviewer上ではインタラクティブに動きませんので、インタラクティブな動きを試してみたい方はローカルにNotebookをダウンロードしてから動かしてみて下さい。
IPythonでウィジェット(UIパーツ)を使う方法を紹介します。一番簡単なのはインタラクティブなUIを自動的に作成するinteract
関数 (IPython.html.widgets.interact
) を使う方法です。
from __future__ import print_function
from IPython.html.widgets import interact, interactive, fixed
from IPython.html import widgets
:0: FutureWarning: IPython widgets are experimental and may change in the future.
interact
を使うと関数の引数をダイナミックに変化させられる、インタラクティブなUIを作れます。
interact
を使うには、まずinteract
でダイナミックに操作したい関数を定義する必要があります。以下の関数は引数をそのまま表示する単純な関数です。
def f(x):
print(x)
次に、interact
の第一引数として上で定義した関数を渡し、第二引数として整数のキーワード引数(x=10
)を渡してみます。すると関数と紐付けされたスライダーが表示されます。スライダーを動かすと-10から30までの整数の値をとることがわかります。
interact(f, x=10);
10
キーワード引数を実数にすると、スライダーが実数の値をとることがわかります。範囲は同じく-10.0から30.0です。
interact(f, x=10.0);
10.0
キーワード引数として真偽値を渡すと、interact
はチェックボックスを生成します。
interact(f, x=True);
True
キーワード引数として文字列を投げると、interact
はテキストエリアを生成します。
interact(f, x=u"こんにちは世界!");
こんにちは世界!
interact
はデコレータとしても使えます。
@interact(x=True, y=1.0)
def g(x, y):
print(x, y);
True 1.0
ちなみにデコレータを用いた上のコードは、デコレータを用いない以下のコードと等価です。
def g(x, y):
print(x, y)
g = interact(g, x=True, y=1.0)
True 1.0
fixed
を用いた固定引数¶interact
を用いてダイナミックに関数を操作したいけれども、幾つかの引数は一定の値に固定したい場合があります。そんなときに便利なのがfixed
関数です。この場合、固定した引数用のスライダーは生成されません。
def h(p, q):
print(p, q)
interact(h, p=5, q=fixed(20));
5 20
interact
に整数型のキーワード引数(x=10
)を渡したときに、interact
は自動的に[−10,+3×10]を範囲に持つスライダーウィジェットを生成しました。なぜでしょう?実はこの場合、キーワード引数として渡した10
というのは、次の整数型スライダーウィジェット
IntSliderWidget(min=-10, max=30, step=1, value=10)
の省略形になっています。よって10
(スライダーウィジェットの省略形)の代わりに、上記のスライダーウィジェット自体を渡してもまったく同じ結果が得られます。
interact(f, x=10);
10
interact(f, x=widgets.IntSliderWidget(min=-10, max=30, step=1, value=10));
10
この例を見ることにより、interact
がどのようにキーワード引数を処理するのかがわかります。
キーワード引数 | ウィジェット |
---|---|
True or False |
CheckboxWidget |
u'こんにちは世界!' |
TextareaWidget |
整数を用いた value or (min,max) or (min,max,step) |
IntSliderWidget |
実数を用いた value or (min,max) or (min,max,step) |
FloatSliderWidget |
('orange','apple') or {'one':1,'two':2} |
DropdownWidget |
次に、まだ扱っていないウィジェット省略形の使い方の例を示します。
整数の2タプル (min, max)
を渡すと、min
とmax
の値を両方含む整数型スライダーウィジェット(IntSliderWidget
)が生成されます。デフォルトのステップサイズは1に設定されています。
interact(f, x=(0, 4));
2
ステップサイズを変更するには3タプル(min, max, step)
を使います。
interact(f, x=(0, 8, 2));
4
同様に、実数の2タプル (min, max)
を渡すと、min
とmax
の値を両方含む実数型スライダーウィジェット(FloatSliderWidget
)が生成されます。実数スライダーの場合、デフォルトのステップサイズは0.1に設定されてます。
interact(f, x=(0.0, 10.0));
5.0
ステップサイズを変更するには3タプル(min, max, step)を使います。
interact(f, x=(0.0, 1.0, 0.01));
0.49
スライダーウィジェットの初期値を設定する場合は次のようします。整数型でも実数型でも同じやり方です。
@interact(x=(0.0, 20.0, 0.5))
def q(x=5.5):
print(x)
5.5
ドロップダウンメニューは文字列タプルを渡すことで作ることができます。この場合選択された文字列がそのまま関数fに渡されます。
interact(f, x=(u'マンゴー', u'パイナップル', u'シークワサー'));
マンゴー
表示される文字列以外の値を関数に渡したい場合は辞書を引数として渡します。
interact(f, x={'one': 1, 'two': 2, 'three': 3});
3
Python 3.x で導入された関数アノテーションを用いてすっきりと記述することもできます。この場合、python 2.x とPython 3.x で記述方法が違います。
# Python 3.x
def f(x:True):
print x
interact(f);
File "<ipython-input-20-a1e36250ea15>", line 3 def f(x:True): ^ SyntaxError: invalid syntax
# Python 2.x
from IPython.utils.py3compat import annotate
@annotate(x=True)
def f(x):
print(x)
interact(f);
True
interact
ではなく、interactive
というのもあります。interact
はウィジェットをすぐに表示するのに対し、interactive
はBoxというウィジェットのインスタンスを返します。Boxウィジェットは他のウィジェットのコンテナとなります。
def f(a, b):
return a + b
w = interactive(f, a=10, b=20)
type(w)
IPython.html.widgets.widget_box.Box
生成されたBoxウィジェット(w)の中には、個別に生成されたスライダーウィジェットが2つ入っていることがわかります。
w.children
(<IPython.html.widgets.widget_int.IntSlider at 0x106413f90>, <IPython.html.widgets.widget_int.IntSlider at 0x1064285d0>)
Boxウィジェットの中身を表示するにはdisplay関数を用います。
from IPython.display import display
display(w)
現時点でのキーワード引数
w.kwargs
{'a': 10, 'b': 20}
現時点での戻り値
w.result
30