#!/usr/bin/env python # coding: utf-8 # # Interactの使い方 # ちょこちょこ変えてますが基本的に[Using Interact](http://nbviewer.ipython.org/github/melund/ipython/blob/master/examples/Interactive%20Widgets/Using%20Interact.ipynb#)の日本語訳です。なお、nbviewer上ではインタラクティブに動きませんので、インタラクティブな動きを試してみたい方はローカルにNotebookをダウンロードしてから動かしてみて下さい。 # IPythonでウィジェット(UIパーツ)を使う方法を紹介します。一番簡単なのはインタラクティブなUIを自動的に作成する`interact`関数 (`IPython.html.widgets.interact`) を使う方法です。 # In[1]: from __future__ import print_function from IPython.html.widgets import interact, interactive, fixed from IPython.html import widgets # ## Interactの基礎 # `interact`を使うと関数の引数をダイナミックに変化させられる、インタラクティブなUIを作れます。 # # `interact`を使うには、まず`interact`でダイナミックに操作したい関数を定義する必要があります。以下の関数は引数をそのまま表示する単純な関数です。 # In[2]: def f(x): print(x) # 次に、`interact`の第一引数として上で定義した関数を渡し、第二引数として整数のキーワード引数(`x=10`)を渡してみます。すると関数と紐付けされたスライダーが表示されます。スライダーを動かすと-10から30までの整数の値をとることがわかります。 # In[3]: interact(f, x=10); # キーワード引数を実数にすると、スライダーが実数の値をとることがわかります。範囲は同じく-10.0から30.0です。 # In[4]: interact(f, x=10.0); # キーワード引数として真偽値を渡すと、`interact`はチェックボックスを生成します。 # In[5]: interact(f, x=True); # キーワード引数として文字列を投げると、`interact`はテキストエリアを生成します。 # In[6]: interact(f, x=u"こんにちは世界!"); # `interact`はデコレータとしても使えます。 # In[7]: @interact(x=True, y=1.0) def g(x, y): print(x, y); # ちなみにデコレータを用いた上のコードは、デコレータを用いない以下のコードと等価です。 # In[8]: def g(x, y): print(x, y) g = interact(g, x=True, y=1.0) # ## `fixed`を用いた固定引数 # `interact`を用いてダイナミックに関数を操作したいけれども、幾つかの引数は一定の値に固定したい場合があります。そんなときに便利なのが`fixed`関数です。この場合、固定した引数用のスライダーは生成されません。 # In[9]: def h(p, q): print(p, q) # In[10]: interact(h, p=5, q=fixed(20)); # ## ウィジェット(UIパーツ)の省略形 # `interact`に整数型のキーワード引数(`x=10`)を渡したときに、`interact`は自動的に$[-10, +3 \times 10]$を範囲に持つスライダーウィジェットを生成しました。なぜでしょう?実はこの場合、キーワード引数として渡した`10`というのは、次の整数型スライダーウィジェット # # IntSliderWidget(min=-10, max=30, step=1, value=10) # # の省略形になっています。よって`10`(スライダーウィジェットの省略形)の代わりに、上記のスライダーウィジェット自体を渡してもまったく同じ結果が得られます。 # In[11]: interact(f, x=10); # In[12]: interact(f, x=widgets.IntSliderWidget(min=-10, max=30, step=1, value=10)); # この例を見ることにより、`interact`がどのようにキーワード引数を処理するのかがわかります。 # # 1. もしキーワード引数が「値を設定されたウィジェットのインスタンス」であれば、このウィジェットをそのまま使う。 # 2. それ以外は、キーワード引数として与えられた値を「ウィジェットの省略形」として扱う。これはキーワード引数として与えられた値を内部的にウィジェットに変換してから使うということです。 # # | キーワード引数 | ウィジェット | # |:-- |:--| # | `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に設定されています。 # In[13]: interact(f, x=(0, 4)); # ステップサイズを変更するには3タプル`(min, max, step)`を使います。 # In[14]: interact(f, x=(0, 8, 2)); # 同様に、実数の2タプル `(min, max)` を渡すと、`min`と`max`の値を両方含む実数型スライダーウィジェット(`FloatSliderWidget`)が生成されます。実数スライダーの場合、デフォルトのステップサイズは0.1に設定されてます。 # In[15]: interact(f, x=(0.0, 10.0)); # ステップサイズを変更するには3タプル(min, max, step)を使います。 # In[16]: interact(f, x=(0.0, 1.0, 0.01)); # スライダーウィジェットの初期値を設定する場合は次のようします。整数型でも実数型でも同じやり方です。 # In[17]: @interact(x=(0.0, 20.0, 0.5)) def q(x=5.5): print(x) # ドロップダウンメニューは文字列タプルを渡すことで作ることができます。この場合選択された文字列がそのまま関数fに渡されます。 # In[18]: interact(f, x=(u'マンゴー', u'パイナップル', u'シークワサー')); # 表示される文字列以外の値を関数に渡したい場合は辞書を引数として渡します。 # In[19]: interact(f, x={'one': 1, 'two': 2, 'three': 3}); # ## interactで関数アノテーションを使う # Python 3.x で導入された関数アノテーションを用いてすっきりと記述することもできます。この場合、python 2.x とPython 3.x で記述方法が違います。 # In[20]: # Python 3.x def f(x:True): print x interact(f); # In[21]: # Python 2.x from IPython.utils.py3compat import annotate @annotate(x=True) def f(x): print(x) interact(f); # ## interactive # `interact`ではなく、`interactive`というのもあります。`interact`はウィジェットをすぐに表示するのに対し、`interactive`はBoxというウィジェットのインスタンスを返します。Boxウィジェットは他のウィジェットのコンテナとなります。 # In[22]: def f(a, b): return a + b # In[23]: w = interactive(f, a=10, b=20) # In[24]: type(w) # 生成されたBoxウィジェット(w)の中には、個別に生成されたスライダーウィジェットが2つ入っていることがわかります。 # In[25]: w.children # Boxウィジェットの中身を表示するにはdisplay関数を用います。 # In[26]: from IPython.display import display display(w) # 現時点でのキーワード引数 # In[27]: w.kwargs # 現時点での戻り値 # In[28]: w.result