[最終更新] 2017年2月21日
本記事では、二軸が必要なテキストファイルの時系列データをgnuplotで描きます。
なんだかんだでgnuplot
大学時代から、ずっとgnuplotを使っています。最近はようやくPythonやJavaScriptでもグラフを描くようになり、簡単なコマンドで高機能なライブラリを使うことが出来る素晴らしさに喜び半分打ちひしがれるような気持ち半分といったところでしたが、相変わらず一番愛用しているのはgnuplotです。
gnuplotのコマンド体系はお世辞にもわかりやすいとは言えず、最初はグラフを描いたり、csvデータを読み込むんだりするだけでも一苦労です。そしてハマるのがグラフのファイル保存。これがなかなか難しく、色々なサイトを参考にするのですが、書いてあるコマンドがまた微妙に違ったりもするものですから、覚えるのに苦労した記憶があります。
しかし人間なんでも慣れるもので、奇っ怪に見えたコマンドも今はそれなりに馴染みました。馴染めば、便利なものです。たいていのUnix系システムであれば、コマンド一発でインストールできますし、インストールさえしてしまえばあとはスクリプトを流用できます。シェルスクリプトで簡単に使えることができるのは、今なお得難い手軽さであると思います。
前置きが長くなりましたが、本記事では時系列のcsvデータを読み込んでグラフを描く、保存するためのシェルスクリプトをメモします。
端末上で簡単に時系列csvデータのグラフを描き保存するためのスニペット
以下のようなデータ sample.csv があるとします。
2015/09/26 00:00:00,24.500,23.90,96287.0,24.55,96389.2,51.91
2015/09/26 00:00:02,24.500,23.90,96288.0,24.53,96383.4,51.85
2015/09/26 00:00:03,24.375,23.90,96287.0,24.54,96382.3,51.92
2015/09/26 00:00:04,24.375,23.90,96285.0,24.54,96385.0,51.93
2015/09/26 00:00:06,24.375,23.90,96285.0,24.55,96385.8,51.94
2015/09/26 00:00:07,24.500,23.90,96277.0,24.55,96385.8,51.92
2015/09/26 00:00:09,24.625,23.90,96282.0,24.55,96385.8,51.90
2015/09/26 00:00:10,24.500,23.90,96288.0,24.55,96383.1,51.91
2015/09/26 00:00:11,24.500,23.90,96287.0,24.55,96388.4,51.91
2015/09/26 00:00:13,24.625,23.90,96285.0,24.54,96379.6,51.90
一列目の時刻、二列目の温度、四列目の気圧を抽出して、グラフを描くようなシェルスクリプト描きます。ポイントは、区切りがカンマであること、時刻表記があること、温度と気圧で軸の単位が異なることです。また、四列目の気圧は、単位がPaですが、これをhPaに直したいと思います。
以下のスクリプト mkgraph.sh を作成します。
#!/bin/sh
set -u
INFILE=$1
OUTFILE="${INFILE%.*}.png"
TITLE="title"
XLABEL="time"
YLABEL="C"
Y2LABEL="hPa"
gnuplot <<EOF
set datafile separator ','
set xdata time
set timefmt '%Y/%m/%d %H:%M:%S'
#set format x '%H:%M'
set format x '%M:%S'
#set xrange ['2015/09/26 10:00:00':'2015/09/26 12:00:00']
set mxtics 2
set mytics 2
set grid xtics ytics mxtics mytics
set key outside
# second ax
set y2tics
set title '$TITLE'
set term png size 800,480
set xlabel '$XLABEL'
set ylabel '$YLABEL'
set y2label '$Y2LABEL'
set output '$OUTFILE'
p '$INFILE' u 1:2 w l ti 'temperature','$INFILE' u 1:(\$4/100.0) w l axes x1y2 ti 'pressure'
set output
EOF
だいたい見ればわかると思いますが、補足します。
- set datafile separator ‘,’で、区切りをカンマに設定
- set xdata timeとset timefmtで、時系列データであることを示し、また時刻の表記について設定
- コメントアウトしているset xrangeは、時刻の範囲の設定。設定しなければ自動で決まる
- mxticsは小軸を作成
- set gridで軸の点線をグラフ中に引く
- set key outsideは、凡例をグラフの外にだす
- set y2ticsで、軸が2つ使える
- set term pngで、pngとして出力するように設定し、800,480で画像の大きさを設定(デフォルトは640×480)
- pはplot、つまり描画コマンドの略記。二つのグラフを描くので、カンマで区切る。一つ目が温度、二つ目が気圧のグラフ
- y2軸を用い、また数値をすべて100で割るようにしている。通常の$にエスケープシーケンスの\を加えているところが注意ポイント
以上、実行権限を与えて実行します。
$ chmod u+x mkgraph.sh
$ ./mkgraph.sh sample.csv
-> sample.png
グラフが作成されます。実際に使うときは、必要なところを変更したりコメントアウトしたりして使いまわしています。
関連記事
シェルスクリプト の記事
- [2016年5月9日] Macで複数のpngファイルをpdfに変換する
- [2016年2月23日] SC2029: Note that, unescaped, this expands on the client side. について
- [2016年2月17日] shellcheck で ls | grep が怒られた…ls の出力をパースしてはいけない?
- [2016年1月28日] Macで複数ページのpdfを一括でjpegにコマンドラインで変換する
- [2015年10月10日] Gnuplot入門クイックツアー 二次元グラフ描画で困らなくなるまで
- ---本記事---
スポンサーリンク