2012-04-01 34 views
0

友人、私はgnuplotを使ってグラフに印刷する膨大な量のデータを持っています。 グラフの点数が大きすぎるので、私はcsplineデータ補間法を使ってデータを平滑化しています。しかし補間法は、プログラムの性能解析において重要ないくつかの異常値をスキップしている。極端な異常値(x以上の値が異なる値)がgnuplot関数によって見逃されないようにするにはどうすればよいですか?データの平滑化のためのgnuplotデータ補間方法

ここではプロットを生成するために使用しているコードです。生成された

plot data_file binary format='%uint64 %double %double %double' using 1:2 smooth csplines title "Kernel hit-rate" with lines, \ 
data_file binary format='%uint64 %double %double %double' using 1:3 smooth csplines title "User hit-rate" with lines, \ 
data_file binary format='%uint64 %double %double %double' using 1:4 smooth csplines title "Overall hit-rate" with lines 

グラフは以下の通りである:

With CSplines

Without CSplines

私は彼らがあまりにも遠くはない場合にのみ、ポイントを滑らかにする(設定可能なパラメータ)をgnuplotにしたいです?また、私は必要なものを行うことができる他のプロットツールを提案することができますか?

+0

グラフの意味論に入らないでください。 –

+1

私は混乱しています、最初のプロットはcsplinesで、2番目のプロットはありませんか?もしそうなら、あなたはcsplinesで正確に何を達成しようとしていますか?(つまり、2番目のグラフで何が問題なのですか?) – mgilson

+0

(1)最初のプロットはcsplinesで、2番目の部分はcsplinesなしです。 (2)2番目のグラフでわかるように、いくつかのy値が0.8から0.9に達するのがわかります。残念ながら、(5000)周りのx範囲の最初のグラフのピークは約0.1 –

答えて

2

おそらくシェルマジックとset tableの組み合わせでこれを達成できます。たとえば、次のように

set samples 200 #How many points will be used in interpolating the data... 
YLIMIT=.5 #for example 
set table 'junkfile1.dat' #This holds the "smooth" portion 
plot 'data_file' binary format='%uint64 %double %double %double' using 1:($2<YLIMIT ? $2: 1/0) smooth csplines 
unset table    #This holds the "spurious" portion 
set table 'junkfile2.dat' 
plot 'data_file' binary format='%uint64 %double %double %double' using 1:($2>YLIMIT ? $2: 1/0) 
unset table 

plot '< sort -n -k 1 junkfile1.dat junkfile2.dat' u 1:2 with lines 
!rm junkfile1.dat junkfile2.dat #cleanup after ourselves 

(未テスト)

+0

問題は、並べ替えやその他の関数は、ASCIIのデータでのみ動作し、バイナリの日ではないことです。私は、グラフの形式を変更し、上記のコードで確認しようとしています。 –

+1

'plot ' mgilson

+0

私は上記の方法を試しました。それは小さな入力のために働くが、大きな入力の場合は、テーブルのメモリエラーを表示してクラッシュします。 –

関連する問題