はじめに
Google Summer of Code 2014にSciRubyの学生として参加していました。 3か月の期間が無事終了し、ちゃんとした成果物ができたので記事にします。 Nyaplotについて、コードや詳しい使い方はこちらをご覧ください:
あーなんか余裕なかったなあとかGSoCの感想みたいなのはまた落ち着いてから書こうかと思います。
概要
IRuby notebook上で動作する、plotのためのgem。
すごいところ
インタラクティブな/インタラクティブにplotができる。
IRuby notebook上で対話的にプロットを作ることができます。また標準で用意される様々なモジュールがユーザーの対話的な操作を支援します。
作ったプロットはSVGやWebGLを使いブラウザ上に表示でき、マウスやタッチパネルで触れることができます。 この例のように複数ペイン間でデータのフィルタリングを行うこともできます。
公開もnotebookをDropboxやgistに張り付けてnbviewerのリンクを送るだけです。 こんな感じでコードにmarkdownで簡単な説明を付けてgistで公開、みたいなことがすぐにできます。
色んなプロットができる。
基本的な2Dのグラフから3Dプロット, 地図上でのプロット, circos風の環状プロットまで様々なものをこのgemだけで作ることができます。 JavaScriptとRubyですぐに拡張が作れるのでJavaScriptの教養があれば自由にプロットを追加できます。
使い方が簡単
私感ですがmatplotlibやBokehのようなMATLAB風のAPIを備えたソフトウェアは、簡単なプロットのときはいいのですがちょっと複雑なプロットを作ろうとすると行数が爆発する傾向があると感じます。 Nyaplotではこの例のように、気象データの可視化のような複雑な課題でもプロット部分はわずか数行ですみます。 IRuby上では補完も効くのでいちいち使い方を調べる必要もありません。
使い方
gem install nyaplot
でインストールできます。
gemのディレクトリの中のexamples/rb/*にサンプルコードがいくつか入っているので実行するとプロット結果がhtmlで出力されます。
Nyaplot単体でも動くのですが、IRuby notebookを一緒にインストールすることをお勧めします。 IRubyはブラウザ上で動く対話的なRubyの実行環境で、NyaplotはIRuby上で動作するように設計されています。 上の動画もIRuby上での動作を録画したものです。 インストール方法がやや煩雑なので別途Qiitaに書いた記事を参考にしてください。
API(一部)
以下ではNyaplotの機能のほんの一部しか紹介していません。詳しくはチュートリアルとドキュメントをご覧ください。
以下のコードで散布図を作ることができます。
plot = Nyaplot::Plot.new sc = plot.add(:scatter, [0,1,2,3,4], [-1,2,-3,4,-5]) plot.show
Nyaplot::Plotがプロットの基本となるクラスで、Plot#add
で新しい図を追加できます。add
はNyaplot::Diagram
のインスタンスを返し、このオブジェクトが持つメソッドを呼び出すことで図の設定を変えることができます。
例えば色を変えるには以下のようなコードを書きます。
color = Nyaplot::Colors.qual sc.color(color)
Colors.qual
は質的(qualitative)データのプロットに最適な色のセットをランダムに返します。IRuby上ならば上のようにその場で色を確認することができ、何度か実行して好きな色を選択することができます。
出来上がったプロットは以下のコードで確認できます。
Plot#export_html
に引数を渡すと出力されるhtmlファイルの名前を指定することができます。
plot.show # show plot on IRuby notebook plot.export_html # export plot to the current directory as a html file
上のサンプルはとてもシンプルなものですが、Nyaplot::DataFrame
を使うことでより複雑なプロットを作ることができます。
df = Nyaplot::DataFrame.new({a: [0,1,2,3,4], b: [-1,2,-3,4,-5], type: ['a','b','a','a','b']})
Plot#add_with_df
を使ってDataFrameを元にプロットを作ることができます。
Diagrams::Scatter#fill_by
の引数に行(column)の名前を指定することでその行の値にしたがって各点の色を塗り分けることができます。
sc = plot.add_with_df(df, :scatter, :a, :b) sc.fill_by(:type) plot.show
雑感
かなり使えるやつなので是非お試しください。 問題や提案などあればGitHubのIssueかpull-reqでお願いします。