MY-NOTEBOOK

Tuesday, December 16, 2008

Processing+POIをエクセルグラフウィザードの代替として使う

Processingは、簡易スクリプト的な記述でイラスト画像を(対話的に)作成できるツールです。
他にもいろいろな活用方法があるので詳しくは http://www.processing.org/http://processing.jp/ をご覧ください。

今回のご相談

今回はエクセルで管理している資金繰りデータをグラフ(チャート)化したいが、
その際、現預金の残高が...

  • 基準以下になら
  • 基準以上なら を表示したい

という相談でした。

エクセルのグラフウィザードでこういったカスタマイズができればよいと思ったのですが、調べてみると、背景画像を入れたり、色を変えるなどのあらかじめ想定されている特定項目のカスタマイズはできるのですが、今回のようなあまり一般的とは言えないカスタマイズには対応していないようです。

そこで、POIとProcessingを組み合わせて実現することにしました。
手順としては、以下のようになります。

  1. エクセル上のデータを“POI”:http://jakarta.apache.org/poi/ を使って読み取る
  2. 読み取り結果をProcessingを使って棒グラフにする
  3. 棒グラフにカスタマイズ表現を入れる
  4. 印刷機能などをJava Printing APIで実装する

手間の面から、エクセルのグラフウィザードとの比較で考えると、多くのケースでは、グラフをちょっとカスタマイズしたいだけなのに面倒すぎ!ということになるとは思いますが。

とはいえ、Javaプログラマであれば、かなり簡単に実装できます。
肝心のグラフ(チャート)を描画する部分についても、Processingのスクリプト言語が非常に扱いやすいため、凝った表現をするのもかなり簡単です。

したがって、手間をかけるだけの価値のあるグラフ(チャート)カスタマイズが必要な状況では有効なアプローチと思われます。

なお、今回Processingでチャートを作成するには、“ビジュアライジング・データ——Processingによる情報視覚化手法(オライリー)”:http://www.oreilly.co.jp/books/9784873113784/ を参考にしました。

Processingではなく、JFreeChartを使う

Processingの代わりに JFreeChart のような Javaによるチャートライブラリを使う手もあります。
しかし、チャートライブラリの場合、チャートを手間無く描けるようにAPIがデザインされていることが多く、ライブラリ作者の想定外の{u:凝ったカスタマイズ・変わったカスタマイズ}をするのは、かえって手間が増える場合があります。
Processingは、その点、汎用的な視覚表現を簡単に作成できるようにデザインされているため、(つまり、チャート作成だけにフォーカスした設計になっていないため) 凝ったカスタマイズ・変わったカスタマイズ に対する柔軟性が高いと感じています。

スケッチプログラミング

Processingは、単にスクリプト的にイラスト作成できるだけでなく、PDE という対話環境が標準で用意されているので、書いたスクリプト結果を即座にイラストに変換してみることができます。

こういうのをスケッチプログラミングと呼んでいるようですが、スケッチプログラミングといえば、MITの(脱線しますが、最近ではSimplicityという本も出版されている) John Maeda氏が DBN というProcessingと似たスタイルのスケッチプログラミング環境を紹介していて関心を持っていました。(ずいぶん前の話ですが)

Processingのおもしろいところは、単に静止したイラストを描くのではなく、動的なイラストも同じスケッチ手法で描けてしまうということです。
こちらの記事 によると、 iTune8のビジュアライザとして使用されているとか。

NHKのピタゴラスイッチのフレーミーのようなアニメーションも(音は別でしょうが) Processingでつくることができるのではないかと私は思っています。 普通は、その手のアニメーションといえば、Flashだと思いますが、Flashのタイムラインによるアニメーション手法というのが、プログラマであるわたしにとっては、性に合わないのです。

ProcessingはJavaで実装されていて、PDEから使うのではなく、Javaに埋め込んで使うこともできます。(PAppletを継承するだけ!) Javaプログラマにとっては非常に扱いやすいです。

© 2006-2012 Tomoaki Oshima