用于平滑数据的gnuplot数据插值方法

时间:2012-04-01 10:58:48

标签: plot matplotlib gnuplot

朋友们,我使用gnuplot在图表上打印了大量数据。 由于图中的点数太大,我使用cspline数据插值方法来平滑数据。但是插值方法正在跳过一些异常值,这些异常值在程序性能分析中可能很重要。我应该如何确保gnuplot函数不会错过极端异常值(值差异大于x)。

以下是我用于生成图表的代码。

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只有在它们不太远的情况下才能平滑点(一个可配置的参数)?您还可以建议任何其他可以做我需要的绘图工具吗?

1 个答案:

答案 0 :(得分:2)

你可以通过shell magic和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

(未测试的)