2013年1月8日火曜日

[Perl]Gnuplot

Chart::Graph で Gnuplot を操作
Chart::Graph モジュールをインストール
ppm> install Chart-Graph
Windows で実行すると temporary directory `/tmp/Graph_Gnuplot_xxxx' を作成できないとエラー表示されるので、環境変数に TMPDIR を設定すればよいと考えたのだが、
> set TMPDIR=%USERPROFILE%\Local Settings\Temp
このようにすると出力先指定でディレクトリ記号が
set output "C:\Documents and Settings\xxxxxxx\Local Settings\
            Temp/Graph_Gnuplot_7672/plot.2.png"
\ (円マーク)と / (スラッシュ) の混在となってしまう。これでは gnuplot が解釈できないのでスクリプト内で
$ENV{TMPDIR}=".";
と指定して出力先を current directory 以下にしてもらう。
set output "./Graph_Gnuplot_7980/plot.2.png"
スクリプトから gnuplot を実行しようとするところで
program not found in search path: gnuplot
とエラー表示される。これは Chart::Graph::Utils 内で使用される _get_path が Linux 形式の PATH しか対応していないためである。
sub _get_path {
    my ($exe) = @_;
    my @path = split (/:/, $ENV{PATH});
    my $program;

    foreach my $i(@path){
   $program = "$i/$exe";
   if (-x $program) {
  return $program;
   }
    }

    carp "program not found in search path: $exe";
    return 0;
}
また gnuplot というコマンドを実行しようとするので Perl/site/lib/Chart/Graph/Gnuplot.pm にある gnuplot コマンドを設定する _set_gnupaths を見てみると
sub _set_gnupaths {

    if (not defined($gnuplot)) {
 if (not $gnuplot = _get_path("gnuplot")) {
     return 0;
 }
    }

    if (not defined($ppmtogif)) {
 if (not $ppmtogif = _get_path("ppmtogif")) {
     return 0;
 }
    }
    return 1;
}
となっているので $gnuplot に直接実行プログラムを記述してやればこの問題は回避できる。
使い方
Windows 用 Gnuplot では pgnuplot.exe なので下記のように指定する。
$Chart::Graph::Gnuplot::gnuplot = "c:/usr/gnuplot/bin/pgnuplot.exe";
Example: テストスクリプト
use utf8;
use Chart::Graph::Gnuplot qw(gnuplot);
$Chart::Graph::save_tmpfiles = 0;
$Chart::Graph::Gnuplot::gnuplot = "c:/usr/gnuplot/bin/pgnuplot.exe";

$ENV{TMPDIR}=".";

gnuplot({'title' => 'Test graph',
   'xrange' => '[0:3]',
   'yrange' => '[0:50]',
   'output type' => 'png',
   'output file' => 'test.png',
   'size' => [0.625, 0.625],
   'extra_opts' => join("\n", 'set grid'),
},
  [{'title' => 'data1',
    'type' => 'matrix'}, [[0,5],
        [1,10],
        [2,20],
        [3,30]]],
  [{'title' => 'data2',
    'style' => 'lines',
    'type' => 'matrix'}, [[0,20],
        [1,5],
        [2,15],
        [3,12]]],
  [{'title' => 'y=10x+10',
    'style' => 'lines',
    'type' => 'function'}, '10+10*x'],
 );
size を指定しているのは、出力データの画像サイズを調整するため。デフォルト (size 指定なし) では 640x480 pixel となるので 400x300 pixel を作りたければ縦横 0.625 倍と指定すればよい。
出力結果

0 件のコメント:

コメントを投稿