読者です 読者をやめる 読者になる 読者になる

Javaでgnuplotを使ってグラフを生成するJavaPlot on Mac OSX Lion

Javaで数式やら統計やらのグラフ画像を生成できるといいなあ、と思い、やはりgnuplotだろうなあ、と思っていると、などというジャストミートなライブラリを見つけた。
どうやら、Javaで書いたとおりにgnuplotを動かしてグラフ画像を生成してくれるらしい。

で、gnuplotもまじめに使ったことがなかったので、そのインストールから始めたわけだが、妙な所でハマったので一応メモ。
環境はMac OSX Lion (10.7.5)。

とりあえずgnuplotをインストール

(2014年1月29日追記: Mac OS X使ってるなら、Homebrewでインストールしましょう...)
MacPortsとかでできるらしいが、なんかいまいちうまく行かなくてよくわからなかったので、ソースコードからインストール。(おそらくこの判断が一番の間違い)
gnuplot homepageから最新のソースコード(2013年1月23日現在で4.6.1)を入手してきて解凍し、

$ cd gnuplot-4.6.1/
$ ./configure

すると、なんか嫌な文字が。

png terminal: no (requires libgd)

むむむ。
実は、JavaPlotで一番使うことになるであろうImageTerminalクラスのgetImage()はgnuplotのterminalをpngに変更して、そのpngをImageIO.readで読み込むことでBufferdImageに変換してくれている。
だから、とりあえずpng terminalをyesにするためにlibgdをインストールすることにした。
ちなみに、このままmakeとmake installをやっても、とりあえず動くことは動くし、自分の環境ではX11 terminalは正常に動作した。

libgdのインストール

libgdとは、よく知らないが、pnggif、jpgの画像を生成するためのCライブラリらしい。
とりあえずググっていると、本家のサーバーは長いことダウンしたままらしいが、Repository deleted — Bitbucketからダウンロードできることが発覚。
Downloads -> Tags -> GD_2_0_33のgz
をダウンロードした。(最新版っぽいのにしなかったのはGDライブラリがダウンロードできない! ・・・GDライブラリの提供元(www.libgd.org)サイトが早く復活してほしい - r_nobuホームページを参考にしていたから)

普通に解凍して解凍したディレクトリに移動し、

$ ./configure
...
$ make

で、大量にエラー発生。
え。
どうやら、png.hとやらが見つからないらしい。

libpng12のインストール

調べてみるとpng.h not found on MacOS Lion · Issue #96 · DCPUTeam/DCPUToolchain · GitHubにあるように、

/usr/X11/include/libpng15/

にバージョン1.5があるのだが、どうやらバージョン1.2でないといけないらしい。
configureの吐き出したログをもう一度みてみると

checking for libpng12-config... no

と確かにlibpng12を探しに行っている。

そこで、再度 libpng-1.2.5 を ソースから インストールを参考にlibpng-1.2.5.tar.gz [505988 bytes] - Download Mirrors (1/8)の中の適当なアドレスからgzをダウンロード。
解凍してconfigureを実行すると、丁寧に「configureを実行するんじゃなくてscriptディレクトリから適当なmakefileを取り出してmakeしてね」と教えてくださるので、自分の場合は

$ cp script/makefile.macosx Makefile
$ make
...
$ install

でインストールできた。

ようやくJavaPlotを動かすところまで

これでlibgdもインストールできるようになり、gnuplotpng terminalを使える状態でインストールできた。
遂に念願のJavaPlotを動かすべく、からダウンロードしたtarを解凍し、dist/JavaPlot.jarにクラスパスを通しつつ以下のようなコードをコンパイル

import javax.imageio.ImageIO;
import com.panayotis.gnuplot.JavaPlot;
import com.panayotis.gnuplot.terminal.ImageTerminal;
public class JavaPlotTest{
	public static void main(String args[]){
		JavaPlot p = new JavaPlot();
		ImageTerminal terminal = new ImageTerminal();
		p.setTerminal(terminal);
		p.addPlot("sin(x)");
		p.plot();
		ImageIO.write(terminal.getImage(), "PNG", "test.png");
	}
}

無事、sin xのグラフのpng画像を生成することができた。