データの多いグラフで活躍する
まえがき †
データロガーの集計データのような膨大なデータをグラフにするのは、 結構大変だ。Excelでやろうとすると巨大なファイルになってしまい、 再表示や印刷に異常なほど時間がかかる。OpenOffice Calcでやろうとしたが、 日付や時刻の扱いがうまくできないのと、巨大なデータからグラフを作ろうとすると 恐ろしく不安定になるようなのであきらめた。
市販のグラフ専用ソフトだと巨大なデータでも問題なく処理してくれるのだろうが、 10万円前後といい値段だったりする。
どうせデータの前処理に perl だの awk だの必要になるので Debian GNU/Linux 4.0 で gnuplot を使ってやってみることになったが、これが癖があって使いにくい。
インストール †
Debian 4.0 (etch) で Synaptic Package Manager に gnuplot を検索させる。 plotdrop という GNOME 環境でデータファイルをファイルマネージャからドロップ すればとりあえず動くアプリケーションがあるので、これを選択してインストール すれば、gnuplot も一緒にインストールされる。
x11でのサイズと色指定 †
x11に出力するときのサイズと色指定が面倒だ。
gnuplot -geometry 1200x512 -persist \ -xrm "gnuplot*line1Color: red" \ -xrm "gnuplot*line2Color: black" example.plt
というような指定をして、example.plt で
set title "Somewhere Temperature" set xlabel "Date" set ylabel "Celsius" set xdata time set timefmt "%s" set format x "%y/%m/%d" set grid plot "somewhere.dat" using 1:2 with lines title "somewhere", \ "somewhere.dat" using 1:2 smooth bezier notitle with lines
とやれば、ベジエ補間の線が緑から黒に変わる
PNGへの出力 †
データロガーの出力 somewhere.dat と気象庁の過去の平均気温データ jma.dat を 同時にプロットする。
set terminal png size 640,280 set output "somewhere-temp-s.png" set title "Somewhere Temperature" set xlabel "Date" set ylabel "Celsius" set xdata time set timefmt "%s" set format x "%m/%d" set grid plot "somewhere.dat" using 1:2 title "somewhere" with lines,\ "somewhere.dat" using 1:2 smooth bezier notitle with lines,\ "jma.dat" using 1:2 title "jma data" with lines
日付と時刻は、予め perl で epoc day からの秒数に変換して から処理しているが、gnuplotで直接読み込むのも可能かもしれない。
#!/usr/bin/perl use Class::Date qw(:errors date); while (<>) { tr/\//-/; @a = split(' '); $date = date "$a[0] $a[1]"; printf("%d %s\n", $date->epoch, $a[3]); }
perlで Class::Date を使うために libclass-date-perl というパッケージを入れた。
問題点 †
- X軸が時系列だと自動範囲で前後にデータの無い箇所が余分につくことがある。
データの範囲は分かっているのだから明示的に範囲指定してみたが、どうもさらに
おかしくなってしまう。
set xrange ["05/01/07":"05/01/08"]
- 出来上がったx11のグラフの上でマウスを動かすと左下に座標が表示される。 plotdropで出来たグラフではそのような挙動は無いので、なにか設定があるのかもしれない。'm'キーを押せば消えるので、しばらくはこれで画面コピーして使うことになる。 画面コピーではなくpngファイルを直接作れるが、やはり結果を見ながら調整したほうがよい。
- gnuplot 4.0から出力が x11 のとき pause mouse とやると、グラフをマウスによる操作で視点の変更や部分拡大が出来るようだ。2Dプロットで右ボタンで範囲指定拡大させると、プロットしてすぐに終了してしまうようだ。やり方が間違っているのか?
リンク †
- gnuplot homepage - 4.0などの最新版のドキュメントはここにしかないようだ
- gnuplot tips (not so Frequently Asked Questions)
- R Contents - 単なるデータロガー処理にここまでは必要ないかも
&amazon_associate(4924998699);