2015年5月3日日曜日

Gnuplot を使って時系列データからグラフ画像ファイルを作成してみました

以下の 3 つのケースで作成しています。

  • 時系列データとスクリプトを別々のファイルにする
  • 時系列データとスクリプトを同一のファイルにする
  • 複数の時系列グラフを重ね書き

環境

  • Ubuntu 14.04 (Trusty Tahr) Server
  • Gnuplot 4.6 patchlevel 4

時系列データとスクリプトを別々のファイルにする

以下のようなグラフ画像ファイルを作成します。

http://1.bp.blogspot.com/-jkN70vcIsQc/VUYoaQ_2WKI/AAAAAAAAAMw/0a2lGyheQRY/s1600/case0_graph.png

時系列データ case0_data.txt

2015-05-02 12:00:00 515
2015-05-02 12:00:01 522
2015-05-02 12:00:02 538
2015-05-02 12:00:03 544
2015-05-02 12:00:04 545
2015-05-02 12:00:05 546
2015-05-02 12:00:06 548
2015-05-02 12:00:07 549
2015-05-02 12:00:08 562
2015-05-02 12:00:09 563
2015-05-02 12:00:10 564
2015-05-02 12:00:11 565
2015-05-02 12:00:12 566
2015-05-02 12:00:13 579
2015-05-02 12:00:14 580
2015-05-02 12:00:15 581
2015-05-02 12:00:16 582

スクリプト case0.plt

# set output を指定していない (コメントにしている) ので
# 標準出力に画像データが出力されます。
#set output 'test.png'

set terminal png size 640,240 # 出力形式を PNG とし、サイズを指定しています。
set title 'test title'        # グラフのタイトルを指定

set xdata time                  # X 軸を日時として指定
set format x '%M:%S'            # X 軸メモリの日時表示フォーマットを指定
set timefmt '%Y-%m-%d %H:%M:%S' # X 座標の日時データフォーマットを指定

# X 軸、Y 軸のラベルを指定
set xlabel 'time'
set ylabel 'value'

# X 軸、Y 軸の範囲を指定
set xrange ['2015-05-02 11:59:59':'2015-05-02 12:00:17']
set yrange [500:610]

# 今回のデータは '2015-05-02 12:00:00 515' というようになっており
# 単純にスペースで区切ると 2つ目ではなく 3つ目が Y 座標の値となるので
# 'using 1:2' ではなく 'using 1:3' とします。
plot 'case0_data.txt' using 1:3 title 'sample0' with linespoints \
    linetype  1 linewidth 1 pointtype 5 pointsize 0.5

グラフ画像ファイル作成

$ gnuplot case0.plt > case0_graph.png


時系列データとスクリプトを同一のファイルにする

上の 「時系列データとスクリプトを別々のファイルにする」 と同じグラフ画像ファイルを作成します。

http://1.bp.blogspot.com/-I_dhtFPTlbk/VUYob6PhiiI/AAAAAAAAAM4/s_60MBfW55c/s1600/case1_graph.png

時系列データを含むスクリプトファイル case1.plt

# set output を指定していない (コメントにしている) ので
# 標準出力に画像データが出力されます。
#set output 'test.png'

set terminal png size 640,240
set title 'test title'

set xdata time
set format x '%M:%S'
set timefmt '%Y-%m-%d %H:%M:%S'

set xlabel 'time'
set ylabel 'value'

set xrange ['2015-05-02 11:59:59':'2015-05-02 12:00:17']
set yrange [500:610]

# ファイル名の指定を  '-' にしているので
# 以下の 'end' までをデータとして取り込み、グラフを描画します。
plot '-' using 1:3 title 'sample0' with linespoints \
    linetype  1 linewidth 1 pointtype 5 pointsize 0.5

2015-05-02 12:00:00 515
2015-05-02 12:00:01 522
2015-05-02 12:00:02 538
2015-05-02 12:00:03 544
2015-05-02 12:00:04 545
2015-05-02 12:00:05 546
2015-05-02 12:00:06 548
2015-05-02 12:00:07 549
2015-05-02 12:00:08 562
2015-05-02 12:00:09 563
2015-05-02 12:00:10 564
2015-05-02 12:00:11 565
2015-05-02 12:00:12 566
2015-05-02 12:00:13 579
2015-05-02 12:00:14 580
2015-05-02 12:00:15 581
2015-05-02 12:00:16 582
end

グラフ画像ファイル作成

$ gnuplot case1.plt > case1_graph.png


複数の時系列グラフを重ね書き

以下のようなグラフ画像ファイルを作成します。

http://3.bp.blogspot.com/-5bozvK6jSRA/VUYod7aQZ1I/AAAAAAAAANA/VFfNHJK_GJk/s1600/case2_graph.png

複数のグラフを重ね書きするような複雑な処理の場合は上の 「時系列データとスクリプトを同一のファイルにする」 方法は使えず、データファイルとスクリプトは別々のファイルにする必要があるようです。

時系列データ case2_data.txt 。グラフデータのブロックは二行の空行で区切ります。

2015-05-02 12:00:00 515
2015-05-02 12:00:01 522
2015-05-02 12:00:02 538
2015-05-02 12:00:03 544
2015-05-02 12:00:04 545
2015-05-02 12:00:05 546
2015-05-02 12:00:06 548
2015-05-02 12:00:07 549
2015-05-02 12:00:08 562
2015-05-02 12:00:09 563
2015-05-02 12:00:10 564
2015-05-02 12:00:11 565
2015-05-02 12:00:12 566
2015-05-02 12:00:13 579
2015-05-02 12:00:14 580
2015-05-02 12:00:15 581
2015-05-02 12:00:16 582


2015-05-02 12:00:02 123
2015-05-02 12:00:03 142
2015-05-02 12:00:04 162
2015-05-02 12:00:05 191
2015-05-02 12:00:06 227
2015-05-02 12:00:07 268
2015-05-02 12:00:08 27
2015-05-02 12:00:09 51
2015-05-02 12:00:10 6
2015-05-02 12:00:11 31
2015-05-02 12:00:12 10
2015-05-02 12:00:13 41
2015-05-02 12:00:14 71

スクリプト case2.plt

# set output を指定していない (コメントにしている) ので
# 標準出力に画像データが出力されます。
#set output 'test.png'

set terminal png size 640,240
set title 'test title'

set xdata time
set format x '%M:%S'
set timefmt '%Y-%m-%d %H:%M:%S'

set xlabel 'time'
set ylabel 'value'

set xrange ['2015-05-02 11:59:59':'2015-05-02 12:00:17']
set yrange [0:1000]

# 二つのグラフを index 0, index 1 として指定します。
plot \
    'case2_data.txt' index 0 \
        using 1:3 title 'sample0' with linespoints \
        linetype  1 linewidth 1 pointtype 5 pointsize 0.5, \
    'case2_data.txt' index 1 \
        using 1:3 title 'sample1' with linespoints \
        linetype  3 linewidth 1 pointtype 4 pointsize 0.5

グラフ画像ファイル作成

$ gnuplot case2.plt > case2_graph.png

0 件のコメント:

コメントを投稿