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とは、よく知らないが、pngやgif、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もインストールできるようになり、gnuplotもpng 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画像を生成することができた。