« ドリームキャスト VGAボックス等を購入 | トップページ | 4月よりセガサターンの中古売買が違法になります »

2006.03.05

Javaでグラフ - JFreeChartの初歩

前回の予告通り、JFreeChartの解説記事を書こうと思う。まぁメモ程度だけど……

■注意点
私はマカーなので、この記事も MacOSX 10.4(Tiger) + JDK 1.4.2 + JFreeChart 1.0.1 向けに書かれています。ただ、LinuxなどのPC-UNIX系でも多少パスの読み替えなどを行えば、そのまま理解できると思います。


■はじめに - JFreeChart概要
JFreeChartは、Javaでグラフを描くためのライブラリである。
www.jfree.org - JFreeChart
jfreeプロジェクトという、大きなプロジェクトの中の一つらしい。

機能としては非常に高性能で、円グラフ・棒グラフ・線グラフなどの基本的なグラフから、経済分野のグラフ(ローソク足も描ける!)、離散グラフなど幅広いグラフ形式をサポートしている。
またグラフィックス面でも様々な描画オプションを細かく設定でき、美しいグラフを得ることが可能。グラフを描くライブラリとしては、PerlではGD::Graph、PHPではJpGraphがあるけど、JFreeChartはフリーで高機能。しかも作れるグラフも非常に美しいので、それらと比べてかなりアドバンテージがあると思う。

ライセンスは、(1.0がリリースされる前は違った気がするけど) GPL。ただし開発者向けドキュメントとサンプルプログラム(後述)のソースコードは、$40にて有償でオンライン販売されている。

JFreeChartは1.0がリリースされたのがつい最近(2005/12/02)なので、まだまだWeb/書籍共に情報が少ない。っていうか書籍は、雑誌含めてもまだ出てないと思う


■準備
とりあえずダウソしたら、まずは添付のデモを実行してみると良い
Finderからjfreechart-1.0.1-demo.jarをダブルクリックすればいいけど、せっかくなのでターミナルから実行してみよう
$ java -jar jfreechart-1.0.1-demo.jar
20060305jfreechart
これらグラフは画像ファイルとしてPNG形式などで吐くことができるけど、リスナメソッドなども実装されているので、リサイズやマウスクリック時にアプリ上から動的にイロイロやることも出来るようだ。難しそうなのでやってないけど。

開発に必要なのはlibディレクトリの下のjcommon-1.0.0.jarとjfreechart-1.0.1.jarなので、この2つにはクラスパスを通しておこう。
ちなみにバージョン番号が入ったこのファイル名をそのまま使うと、バージョンアップした時に困るので、汎用名にシンボリックリンクを作っておいた方がいい希ガス。
$ ln -s jcommon-1.0.0.jar jcommon.jar
$ ln -s jfreechart-1.0.1.jar jfreechart.jar
$ export CLASSPATH=/hoge/lib/jcommon.jar:/hoge/lib/jfreechart.jar:.

なおこの後も何度か環境変数の設定が出てくるけど、基本的に~/.bash_profileに書いておくと今後もいちいち打たないで済む

開発者向けドキュメントは、PDFファイルの形にて$40でオンライン販売されている。興味があったので買ってみたのだが(日本からでもクレジットカードさえあれば簡単に買えるよ)、このドキュメントは正直期待外れだった。どの機能についてもさらりと触れるだけで、結局APIドキュメントを見ないとダメなのだが、そっちはJavadoc形式で元から公開されてるし。
というわけで、無理して買わなくても、Webで公開されている「Installation Guide」と「JFreeChart - API Documentation」があれば何とかなる気がする


■とりあえず棒グラフ
まぁまずは棒グラフのPNGファイルを吐くサンプルプログラムを作ってみた(TestBarChart.java)。
ソースを適当に解説しよう

* data, columnKeys, rowKeys の用意
dataは実際にグラフを描画するデータ。2次元配列でデータを突っ込む。
columnKeys, rowKeysはラベルの文字列を格納する。グラフの軸をどっち向きにするかは後で変えられるので、PerlのGD::GraphのようにX軸とかY軸という呼び方はしない。注意。
軸ラベルとかは、解説図を作ってみた:
Barchart_sample

*CategoryDatasetオブジェクトの作成
CategoryDataset cData =
DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

実際にグラフを描画する際に必要なCategoryDatasetオブジェクトを、先ほどのデータから生成する。

*JFreeChartオブジェクトを生成
JFreeChart barChart = ChartFactory.createBarChart(
"Here is the Title of your graph",
"Human type",
"counts",
cData,
PlotOrientation.HORIZONTAL,
true, true, true);

ようやくここでグラフが生成できる。FactoryMethodパターンで実装されているChartFactoryを用いるのだが、棒グラフ・円グラフなどグラフの種類ごとにメソッド名が違うので、設定ファイル等で変えることは難しいね
各種引数の説明についてはAPI Documentの項目を参照せよ(手抜き)

*PNG形式で出力
ChartUtilities.saveChartAsPNG(outFile, barChart, 500, 500);
この場合、500x500のPNGファイルでファイルを出力する。やはり画像形式ごとにメソッド名が違うので、引数で吐くファイルの形式を変えることはできない。頭が古い漏れにとっては、これはちとどうかと思うんだが……("JPG"という引数を渡したらJPGで吐く、"PNG"を渡したらPNGで吐くとかしてくれれば、吐く画像形式を変えたい時も外部ファイルの変更だけで済むのにさ)。

*実行
さてこれで実行すればPNGファイルでグラフが吐けるわけだが、一つ注意点がある

JFreeChartは内部でAWT(java.awt.*)を使用しているため、X Window Systemを起動していないLinuxサーバ上などの、グラフィカルサブシステムが無い環境ではエラーになってしまう。
まぁMacOSX上でやるなら問題は無いはずなのだが、余計な問題を回避するために、Javaはheadlessモードで起動した方がいい。具体的には
$ java -Djava.awt.headless=true TestBarChart
というオプションを付ければよい


■Tomcat上でサーブレットからグラフ画像出力
PNG形式で画像ファイルを吐くことに成功したら、次はWebアプリとしてサーブレットを使って実装してみよう

*Tomcatのインストールと準備
まずはApache Tomcatのページからダウンロードする。5.5.x系はJDK5.0用なので、5.0.x系のをダウンロードする
ダウソしたら、とりあえず適当なディレクトリに展開するだけでいい。この設置したディレクトリは $CATALINA_HOME で表現される

次に、環境変数JAVA_HOMEに適切な値を設定する。MacOSXならば、これは/Library/Java/Homeになるので、
$ export JAVA_HOME=/Library/Java/Home
また、先ほど述べたヘッドレスサポートのため、Tomcat自体にもその設定を使うようにする
$ export CATALINA_OPTS="-Djava.awt.headless=true"

ここまでやったら、起動するかを確かめてみる。$CATALINA_HOME/bin の下の、startup.sh を実行する。その後に http://localhost:8080/が開ければOKね
20060218tomcat

最後に、サーブレットを作成するために必要なライブラリが$CATALINA_HOME/common/lib/servlet-api.jarにあるので、CLASSPATHに追加しておく。

*サーブレットの作成
今度はサーブレットでJFreeChartを用いたサンプルプログラムを作ってみた(20060305TestBarChart.java)。
しかし、ここから設置するのが結構メンドい。さすがTomcatだ

*サーブレットの設置
(1) $CATALINA_HOME/webapps に適当なプロジェクトフォルダを作る。ここではtestappsとした
(2) testappsの下に、WEB-INFフォルダを作る
(3) WEB-INFフォルダの下に、classesフォルダとlibフォルダを作る
(4) WEB-INFフォルダの下に、web.xmlファイルを作成。作成するサーブレットを登録する
(5) libフォルダに、JFreeChartのjcommon-1.0.0.jarとjfreechart-1.0.1.jarをコピー
(6) classesフォルダに、作成したプログラムを設置、コンパイルしてclassファイルを設置

まぁややこしいので、とりあえずtestappsフォルダを固めた物を作ってみた(20060305testapps.zip)。これをそのままwebappsの下に置いてもらえば動く……はず。

http://localhost:8080/testapps/servlet/TestBarChart をWebブラウザで叩いてみて、上手くグラフが吐かれればめでたしめでたし。
20060305jfreechart2
ああ疲れた。

|

« ドリームキャスト VGAボックス等を購入 | トップページ | 4月よりセガサターンの中古売買が違法になります »

コメント

宣伝させてください.
jFreeChartを使ったソフトの例です.

http://www.geocities.jp/muffadayo/MjoGraph/indexj.html

投稿: | 2007.04.07 15:09

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2189/8947100

この記事へのトラックバック一覧です: Javaでグラフ - JFreeChartの初歩:

« ドリームキャスト VGAボックス等を購入 | トップページ | 4月よりセガサターンの中古売買が違法になります »