stMind

about Tech, Computer vision and Machine learning

pythonでインタラクティブなデータ可視化を実現するmpld3の紹介

例えば、python機械学習のプログラムを書いて結果を可視化するといった場合、matplotlibを使うことが多いと思いますが、matplotlibで書いた図をインタラクティブに操作出来るようにするmpld3というライブラリがあるので、それを紹介します。

mpld3とは

mpld3は、matplotlibで作成された図をベクタ形式の図に変換し、D3.jsによるデータ操作のHTML/Javascriptを合わせて出力するライブラリです。
出力されたHTMLをブラウザで開くと、拡大縮小やマウスオーバーでtooltipを表示したりといったインタラクティブな操作が可能となっています。

使い方

matplotlibが使えれば、とても簡単にインタラクティブな図を作ることが出来ます。まずはインストールをpipで(jinja2が必要なのでそれも一緒に)。

$ pip install jinja2
$ pip install mpld3

機械学習ライブラリsklearnのSVMの分類をサンプルとして使ってみます。
といっても拡大縮小だけ出来るようにするのであれば、2行だけ付け加えれば完了です!

import numpy as np
import pylab as plt
from sklearn import svm, datasets
from mpld3 import show_d3, fig_to_d3, plugins # インポートして


iris = datasets.load_iris()
X = iris.data[:, :2]
Y = iris.target

h = .02

C = 1.0
svc = svm.SVC(kernel='linear', C=C).fit(X, Y)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

title = 'SVC with linear kernel'

plt.subplot()
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.axis("off")

scatter = plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
plt.title(title)

show_d3() # showする!

すると、ブラウザで図が表示されて、マウスを使った拡大縮小が出来るようになります。(結果はこちら

インポートとshowする所以外は、matplotlibの記述そのままです。

tooltipを表示する場合には、プラグイン機能を使います。
show_d3の前で次の3行(実質は2行)を追加します。

labels = [iris.target_names[id] for id in iris.target]
tooltip = plugins.PointLabelTooltip(scatter, labels=labels)
plugins.connect(fig, tooltip)

同じようにブラウザで図が表示されて、今度は点をマウスオーバーすると、分類したラベル名がポップアップして表示されるようになります。(結果

mpld3の良い部分

図を作る所はmatplotlibの記述がそのまま使えるのがとても良いです。プラグインを使う場合には多少の追加処理が必要ですが、それ以外はほぼmatplotlibなので新たに覚えることはほとんどありません。

まだこれからの部分

とはいえmpld3は開発途中なので、現時点ではサポートしてない機能があります。githubのTODO Listから抜粋すると、

最後に

今回紹介したのは、基本的な部分だけですが、カスタムでプラグインを書けて、さらにインタラクティブな図を作ることも出来ます。
mpld3のexmapleにあるので、興味ある方はぜひご覧ください。

MPLD3 — MPLD3: Bringing Matplotlib to the Browser