gnuplot: ヒストグラムを作成する方法

ヒストグラム(histogram)の作成は意外と面倒な場合が多いです。binのサイズやbinがいくつ存在するかなどから計算を実施して表示する必要があるためです。
gnuplotでは using の中で計算が実施できるというところを利用して、ヒストグラムを描画することができます。

どうすればいいか

min , max , n やデータファイルの名称は適宜変更してください。

min = -5.0 # 左端 (ヒストグラムの最小値、最小binの左端)
max = 5.0  # 右端 (ヒストグラムの最大値、最大binの右端)
n = 20     # binをいくつにするか
# 上述の値からbin幅を計算
width = (max- min)/n
# 与えられた値がどのbinに属するかを計算する関数を定義
bin(x) = width*(floor((x - min)/width)+0.5) + min

plot 'data.dat' using (bin($1)):(1.0) smooth frequency with boxes

説明

width まではそのまま代入と計算を実施しています。

bin(x) は若干複雑に見えますが、与えられた x が属するbinの中央の値を計算しており、ここで値がbinに丸め込まれています。floor は切り捨てをする関数です。binが真ん中に来るように計算をしているため、 +0.5 という計算が入り込んでいます。

例えば 0 => x > 0.5 であれば 0.25 というような計算結果になります。

次に、最後の plot のあたりで実施している内容についてです。

gnuplotでは $1$2 などを利用して、データセットの各データを参照することができます。 $1 であれば1列目の各データ、 $2 であれば2列目の各データ … というように。

これにより、using の後に来ている bin($1) ではデータセットの1列目の各行の値を bin(x) 関数に入れて計算していることになります。

また、 using においてカッコ () を用いることにより using の後の値は plot に利用するカラムの番号ではなく、実際にplotする x, y の値になります。これにより例えば 0.48 という値が来た場合には (x, y) = (0.25, 1) というデータをプロットする、という意味になります。

しかし、それだけではヒストグラムになりません。そこで重要なのが最後の smooth frequency という指定です。これにより x が共通な値をすべて y の値だけ積み上げていく動作になります。ここだと using の後に来ている y の値は (1.0) であるため、指定の x の y値を +1 ずつインクリメントしていくような形になります。

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい