Plotly + iPython Notebook を試す

Date
2013-11-05 16:38
Author

Akihiro Uchida

tags

python

category

memo

slug

plotly-and-ipython-notebook

lang

ja

iPython Notebook は対話的に操作でき、メモを書けて、作業を記録に残すことができる。とても便利。

ただ、現状 iPython notebook でグラフを対話的に拡大、縮小するには matplotlib と qtconsole を使う方法がある。ただ、qtconsole を利用するには当然 Qt を入れる必要があり、 virtualenv を利用していたりするとインストールに一手間かかる。

そこで Plotly という Web サービスと iPython notebook を組み合わせると比較的手軽にグラフ操作ができるので紹介。 (matplotlib は version 1.3 で WebAgg が導入されたので、そのうち iPython notebook と WebAgg を組み合わせれば plotly と同様の操作ができるようになるはず。)

Plotly は Web 上でデータ分析や可視化ができる Web サービス。さらに、以下の言語用の API が提供されていてるので、グラフ用のライブラリとしても利用できる。

  • Python

  • MATLAB

  • Julia

  • R

  • Perl

  • Arduino

REST API も用意されているので、それを使えば他の言語からも利用できるはずです。特に Python は iPython Notebook で plotly の出力する HTML を埋め込むことで、拡大や縮小等を対話的に操作できます。

ただ、以下に示す方法では plotly 自体にアクセス制御機能があるにも関わらず、現状デフォルトでは public に設定されてしまうようです、注意。

インストール、ユーザ登録

pip からインストールできる。

$ pip install plotly

さらにユーザ登録して API キーを取得しておきます。

iPython Notebook から利用する

iPython notebook を起動

$ ipython notebook

plotly を import

import plotly
py = plotly.plotly(username='<your-username>', key='<your-api-key>')

とりあえずデータを作ってみました。

import numpy as np

N = 10000
K = 1.0
twopi = 2 * np.pi

q, p = np.zeros(N), np.zeros(N)
q[0], p[0] = [0.1, 0.1]
for i in range(1,N):
    q[i] = q[i-1] + p[i-1]
    q[i] = q[i] - np.floor(q[i] / twopi) * twopi
    p[i] = p[i-1] + K * np.sin(q[i])
    p[i] = p[i] - np.floor(p[i] / twopi) * twopi

プロットするため、データを plotly 用に json の中に用意します。

data = {'x': q, 'y': p, 'type': 'scatter', 'mode': 'markers', 'marker': {'size': 2}}

plotly にプロットさせてみます。

filename の部分は元データが Standard Map なので stdmap としました。これは plotly 上でデータセットを認識するための名前に利用されます。

response = py.plot(data, filename='stdmap', fileopt='overwrite')

下記のように表示されました、成功したようです:

High five! You successfuly sent some data to your account on plotly. View your plot in your browser at https://plot.ly/~<your-username>/0 or inside your plot.ly account where it is named 'stdmap'

iPython notebook 上に表示させます。

from IPython.display import HTML
src = '<iframe src="{}/600/600" width="650" height="650"></iframe>'.format(response['url'])
html = HTML(src)
html

こうすると iPython notebook 上でグラフが表示され、ドラッグして拡大、ダブルクリックで戻るなど、対話的に操作ができます。

こんな感じです。

参考