Gnuplot直方图(平滑频率)最大位置

时间:2016-05-01 22:36:23

标签: gnuplot histogram

使用smooth freq绘图时,如何获得与y-max对应的x位置?给出一组数据:

#data.dat
7.20051
7.65602
7.87180
8.64177
8.92575
8.65913
8.98814
9.45199
8.40334
8.75102
8.65440
8.21088
8.59719
8.23259
8.34794
8.41658
7.67074
8.44228
8.54347
9.04961
9.18177
....

我尝试了以下内容:

gnuplot
binwidth=0.1
bin(x,width)=width*floor(x/width) + binwidth/2.0
set terminal unknown
plot 'data.dat' u (bin($1,binwidth)):(1.0) smooth freq w l
show variables all

GPVAL_Y2_MAX = 6051.0是我想要的最大y值(峰值),但是如何获得相应的x值?使用stats不允许使用smooth freq,我不想将数据预处理到容器中。有没有办法使用gnuplot获取x值?

1 个答案:

答案 0 :(得分:2)

您实际上可以使用gnuplot预处理该数据。我们假设您的数据类似于

7.20051
7.65602
7.87180
8.64177
8.92575
8.65913
8.98814
9.45199
8.40334
8.75102
8.65440
8.21088
8.59719
8.23259
8.34794
8.41658
7.67074
8.44228
8.54347
9.04961
9.18177

然后运行脚本的第一部分

binwidth=0.1
bin(x,width)=width*floor(x/width) + binwidth/2.0
plot 'data.dat' u (bin($1,binwidth)):(1.0) smooth freq w l

产生

enter image description here

我们在8.45和8.65处看到3的峰值。

现在,我们不能使用stats命令在提供的数据上找到它,但是我们可以在一些预处理数据上使用它,gnuplot可以在这里进行预处理。

set table "tempfile"
plot 'data.dat' u (bin($1,binwidth)):(1.0) smooth freq
unset table

set table命令使gnuplot将绘图分析推送到文件,而不是用它绘制绘图。结果是文件 tempfile 现在包含分箱数据:

# Curve 0 of 1, 14 points
# Curve title: "$k u (bin($1,binwidth)):(1.0)"
# x y type
 7.25  1  i
 7.65  2  i
 7.85  1  i
 8.25  2  i
 8.35  1  i
 8.45  3  i
 8.55  2  i
 8.65  3  i
 8.75  1  i
 8.95  2  i
 9.05  1  i
 9.15  1  i
 9.45  1  i
 8.65  1  u

请注意最后一列中的 i u i 表示范围数据, u 表示超出范围数据。平滑的选项几乎总是添加一个最终点,如超出范围。我们只需告诉stat命令忽略那个。

stat "tempfile" u 1:(strcol(3) eq 'i'?$2:1/0)

这里我们使用stat命令仅在第三列(由strcol函数读取为字符串)等于 i 时使用第一列和第二列分析临时文件。 / p>

现在,STATS_max_y和STATS_pos_max_y变量的值分别为3和8.65。这表明第二个峰值。