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 ずつインクリメントしていくような形になります。
コメント
コメントを投稿