gnuplotのstatsコマンドで取得出来る統計データを用いたグラフプロットの例

gnuplotではデータファイルをプロットする他に、データファイルの統計データを取得するということも出来ます。そして統計データを取得するには「statsコマンド」を使用します。
ここでは取得出来る統計データの扱いに関してはあまり触れず、簡単な利用方法を説明していきます。

statsコマンドの使用方法はドキュメントを読んでもらうとして、実際にコマンドを実行すると端末に統計データの計算結果が出力されます。そして単に結果が出力されるだけでなく、統計用の変数にその結果が代入されます。どのような変数があるかについては、こちらもドキュメントを参照して下さい。

気温のデータを用いた例

statsコマンドを利用した例を、気象庁のデータダウンロードサービスから取得した気温のデータを用いて説明していきます。
取得したデータは以下の通り。
  • 地点 :富士山
  • 期間 : 2018年1月1日〜12月31日
  • 項目 : 日最低気温
取得したデータファイルは扱いやすいようawkなどのコマンドで編集しています。
ここではデータファイルの1列目が行番号、2列目が日付、3列目が日最低気温となっています。
データファイルの一部を抜き出すとこんな感じになってます
283 2018/10/10 -1.7
284 2018/10/11 -3.4
285 2018/10/12 -8.2
286 2018/10/13 -6.3
287 2018/10/14 -11.5
288 2018/10/15 -9.5

データファイルをダウンロードした段階では行番号は付いていません。statsコマンドでは日時データが扱い難いため、取り扱いの観点から行番号を付与しました。2列目に日付が残ってますが、statsコマンドはplotコマンドと同じようにusingで解析する行を指定出来るので1:3のように指定すれば問題ないです。

statsコマンドの実行

statsコマンドは簡単には以下のように実行する形となります。
gnuplot> stats 'test001.csv' using 1:3
(一列だけ解析するなら "using 3" と指定します)
コマンドを実行すると端末上に以下のように解析結果が出力されます。

* FILE:
Records: 365
Out of range: 0
Invalid: 0
Column headers: 0
Blank: 0
Data Blocks: 1

* COLUMNS:
Mean: 183.0000 -8.3805
Std Dev: 105.3660 9.7740
Sample StdDev: 105.5107 9.7874
Skewness: 0.0000 -0.2912
Kurtosis: 1.8000 2.0992
Avg Dev: 91.2493 8.2982
Sum: 66795.0000 -3058.9000
Sum Sq.: 1.62757e+07 60504.2700

Mean Err.: 5.5151 0.5116
Std Dev Err.: 3.8998 0.3618
Skewness Err.: 0.1282 0.1282
Kurtosis Err.: 0.2564 0.2564

Minimum: 1.0000 [ 0] -31.8000 [ 23]
Maximum: 365.0000 [364] 7.5000 [201]
Quartile: 92.0000 -16.1000
Median: 183.0000 -8.3000
Quartile: 274.0000 0.7000

Linear Model: y = 0.03251 x - 14.33
Slope: 0.03251 +- 0.00456
Intercept: -14.33 +- 0.9629
Correlation: r = 0.3504
Sum xy: -4.281e+05


解析結果が代入される変数

出力される解析結果は多岐に渡っていますが、今回は簡単に最小値(Minimum)の値を利用することにします。statsコマンドを実行すると端末上に結果が表示されるだけではなく、それぞれ変数に値が代入されます。
最小値が代入される変数は
  • STATS_min
ですが、これは解析する列が1列の場合。"using 1:3"のように2列指定した場合は
  • STATS_min_y
に2列目の最小値が代入されています。変数の中身を確認するには
gnuplot> print STATS_min_y
としてみて下さい。ここでは"-31.8"と出力されます。2018年で富士山の最も低い日最低気温は-31.8℃だったことが分かります。

変数をグラフ上にラベル表示として利用する

次にこの変数を利用して、最も低い日最低気温をグラフ上にラベルとして表示されてみます。コマンドとしては以下の通り。
gnuplot> set label 1 gprintf("min:%g^{o}C",STATS_min_y) at 310,7 boxed
gnuplot> plot [1:365] 'test001.csv' using 1:3 w lp pt 7 lc "blue"

グラフの右上に最低気温の最小値がラベルとして表示出来ました。

さて、上ではグラフの右上に単純にラベルを配置しただけですが、その他の変数を併用することでもう少しラベルの位置をカスタマイズ出来ます。statsコマンドで2つの列を解析した場合、y列の最大値、最小値に対応するx列の値も変数に代入されています。こと最小値に関しては
  • STATS_pos_min_y
    に代入されています。そしてここでは"24.0"が代入されています(24行目のデータは日付としては"2018/1/24"のものです)。

    "STATS_pox_min_y"と"STATS_min_y"から最も低い日最低気温のプロット点の位置を特定出来るので、これをラベル配置に利用してみます。コマンドは以下の通り。
    gnuplot> set label 1 gprintf("min:%g^{o}C",STATS_min_y) at STATS_pos_min_y, STATS_min_y boxed
    gnuplot> replot

    ラベルがプロットの裏に行ってしまいやや見辛いですが、日最低気温の最小値のプロット点の位置にラベルを配置することが出来ました。もう少しラベル表示に手を加えれば、分かりやすいグラフが出来ると思います。

    最後に

    今回は最小値だけ変数を利用してみましたが、最大値も同様に利用出来ますし、その他の統計データの変数も使うことが出来ます。当然ラベル以外にも変数を利用して計算などにも使用出来るわけで、活用出来る幅は広いんじゃないかと思います。


    さて最後に少し補足しておくと、最小値、最大値はそれぞれ1点のみしか変数に記録されません。なので、最小値と同じ値が2つとか3つあっても今回紹介した方法でラベルをグラフ上に表示しようにも1つだけしか表示出来ません。まぁそれでも一旦別の変数に値を非難させておいて、範囲をずらしてstatsコマンドで解析していくなどすればやって出来ないことはないです。ちょっとめんどうですが。


    その他、gnuplot関連のブログ記事

    コメント

    スポンサーリンク


    このブログの人気の投稿

    Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

    gnuplotでプロットなどの色をcolornameの指定で変更する

    gnuplot : グラフにグリッド線を描く方法(set grid)

    gnuplot : プロット画像のサイズ指定について(set sizeとの違い)

    Pythonのformat()を使って1桁の16進数でも2桁で出力する方法