ヒストグラムを使用gnuplot?
質問
知っているかをヒストグラムで利用"箱"のgnuplot my.datファイルが正しくbinnedデータです。があるので、取り数値のリストとしてgnuplotをヒストグラムに基づく範囲は、binのサイズは、ユーザー?
解決
はい、非常に隠されたものの、その迅速かつ簡単ます:
binwidth=5
bin(x,width)=width*floor(x/width)
plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes
上記のヒストグラムを作る理由を参照してhelp smooth freq
をチェックしてください。
だけはxrange変数を設定した範囲に対処する。
他のヒント
私はカップルの修正/追加Born2Smileは非常に有用な答え:
- 空の箱のボックスに隣接するbin誤が続き、そのスペースこの利用
set boxwidth binwidth
- にBorn2Smileのバージョン、ビングを中心にその下行します。厳密にいるべきであり、そのために下り、上りました。この補正を変更することにより、
bin
機能:bin(x,width)=width*floor(x/width) + width/2.0
うよう十分注意してください:すべての答えをこのページには、暗黙のうちに取る場所の決定は、ビニング開始-左端の一番左のbin場合のようにユーザーの手に委ねたのです。場合、ユーザーは組み合わせこれらの機能のためのビニングデータを自身の判定の場合はビニング開始し,このことについてのブログはリンク上記の機能はすべてが間違っています。任意の出発点にビニング'Min'、補正機能:
bin(x) = width*(floor((x-Min)/width)+0.5) + Min
ではなぜこれが正しい順番にでき数箱点のどこかの一つです。Subtract分からデータポイントを参照され、見るだけでなく、ビニング範囲です。その割binwidthない比較的規模の小さい単位での納'.その"床"の結果の左端のbinを追加0.5への中のbin倍の幅がうまく働台数の箱が絶対的な規模、そして最後に追加の分オフセットお引いたのが始まります。
このことを考え機能アクション:
Min = 0.25 # where binning starts
Max = 2.25 # where binning ends
n = 2 # the number of bins
width = (Max-Min)/n # binwidth; evaluates to 1.0
bin(x) = width*(floor((x-Min)/width)+0.5) + Min
例えばの価値1.1真の左bin:
- この機能が正しくマップのセンターの左bin(0.75);
- Born2Smileの答えは、bin(x)=幅*階(x/幅)場マップで1;
- mas90の答えは、bin(x)=幅*階(x/幅)+binwidth/2.0場マップでは1.5となる。
Born2Smileの答えが正しい場合、binの境界が(n+0.5)*binwidth(n走る以上の整数).mas90の答えが正しい場合、binの境界がn-binwidth.
あなたはこのようなグラフをプロットしますか? はい?そして、あなたは私のブログの記事を見てすることができます:ます。http: //gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.htmlする
コードからキー行:
n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style
#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle
として、Gnuplotは幻想的なツールで描画甘みのグラフでを行う。 しかし, でプロットデータによると、電卓ではより使いやすく、外部プログラムなどオクターブ)により"複雑"計算、このデータを保存するファイルを使用し、Gnuplotのグラフで表示します。上記の問題を、チェックアウトの"hist"機能はオクターブを用い [freq,bins]=hist(data)
, そのプロットすGnuplotを使用
set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes
私は、この議論は非常に有用であることが分かってきたが、私はいくつかの「四捨五入」の問題を経験してきています。
は、より正確には、0.05のビン幅を使用して、Iは0.1と同じビンに0.15落下を読み取る上記ここで提示技術、データポイントと、それに気づきました。この(明らかに不要な挙動が)により、「床」機能に最も可能性があります。
以下は、私の小さな貢献がこれを回避しようとすることです。
bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes
この再帰的方法は、x> = 0です。一つは、より一般的な何かを得るために、より多くの条件文でこれを一般化することができます。
私たちは、再帰的なメソッドを使用する必要はありません、それが遅くなることがあります。私のソリューションは、instrinsic関数intや床のユーザー定義関数RINTのinstesdを使用しています。
rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)
この機能はrint(0.0003/0.0001)=3
ながら、int(0.0003/0.0001)=floor(0.0003/0.0001)=2
が得られます。
なぜ? Perlのint型の関数とパディングゼロの
をご覧ください。私はBorn2Smileのソリューションにほとんど変更があります。
私はあまり意味がないことを知っていますが、念のためにそれをしたいことがあります。あなたのデータは整数であり、あなたが(多分別のデータのセット、またはより細かいグリッドのプロット密度との比較のために)フロートビンサイズが必要な場合は、床面の内側に0と1の間の乱数を追加する必要があります。そうでない場合は、エラーを切り上げによるスパイクがあるでしょう。それは、元のデータに真実ではないパターンを作成しますので、floor(x/width+0.5)
は行いません。
binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))
ビニング機能に関しては、私がこれまでに提供される機能の結果を期待していませんでした。私のビン幅が0.001である場合、すなわち、これらの機能は、私はそれが0.001境界を中心としたビンを持っているために、より直感的に感じるのに対し、0.0005ポイントにビンを中心にしてます。
つまり、私が持っているしたいと思います。
Bin 0.001 contain data from 0.0005 to 0.0014
Bin 0.002 contain data from 0.0015 to 0.0024
...
私が思いついたビニング機能がある。
my_bin(x,width) = width*(floor(x/width+0.5))
ここでは、スクリプトはこの1つに提供されるビンの機能のいくつかを比較することです。
rint(x) = (x-int(x)>0.9999)?int(x)+1:int(x)
bin(x,width) = width*rint(x/width) + width/2.0
binc(x,width) = width*(int(x/width)+0.5)
mitar_bin(x,width) = width*floor(x/width) + width/2.0
my_bin(x,width) = width*(floor(x/width+0.5))
binwidth = 0.001
data_list = "-0.1386 -0.1383 -0.1375 -0.0015 -0.0005 0.0005 0.0015 0.1375 0.1383 0.1386"
my_line = sprintf("%7s %7s %7s %7s %7s","data","bin()","binc()","mitar()","my_bin()")
print my_line
do for [i in data_list] {
iN = i + 0
my_line = sprintf("%+.4f %+.4f %+.4f %+.4f %+.4f",iN,bin(iN,binwidth),binc(iN,binwidth),mitar_bin(iN,binwidth),my_bin(iN,binwidth))
print my_line
}
、ここでは出力です。
data bin() binc() mitar() my_bin()
-0.1386 -0.1375 -0.1375 -0.1385 -0.1390
-0.1383 -0.1375 -0.1375 -0.1385 -0.1380
-0.1375 -0.1365 -0.1365 -0.1375 -0.1380
-0.0015 -0.0005 -0.0005 -0.0015 -0.0010
-0.0005 +0.0005 +0.0005 -0.0005 +0.0000
+0.0005 +0.0005 +0.0005 +0.0005 +0.0010
+0.0015 +0.0015 +0.0015 +0.0015 +0.0020
+0.1375 +0.1375 +0.1375 +0.1375 +0.1380
+0.1383 +0.1385 +0.1385 +0.1385 +0.1380
+0.1386 +0.1385 +0.1385 +0.1385 +0.1390