GNU Plot - 计算峰值数量

3

我有一个11列的非常庞大的文本文件。由于无法发布整个数据,我已将文本文件上传到公共存储库,并在以下链接中找到:http://s000.tinyupload.com/?file_id=59483318155908771897

是否有办法在Linux中使用GNU plot计算峰值数量?从上述文本文件中,我正在绘制第1列和第7列作为x和y列,其中峰值是第7列的变化,这就是我感兴趣的内容。例如,要计算以下图像中频率的峰值数量为10。

这里是我正在使用的简单绘图脚本。

set key right top
set xrange [:10]


#show timestamp
set xlabel "time in sec"
set ylabel "Freq"


set title "Testing"
plot "data/freq.csv" using 1:7 title "Freq", \

感谢您的帮助。

1
不用Gnuplot。但是GNU Octave的findpeaks()函数应该可以做到。 - Thor
1
几点需要注意:它被称为Gnuplot而不是GNU plot。进行信号分析,如在信号中查找峰值,需要使用专门设计用于此类任务的工具,例如GNU Octave。 - Thor
2个回答

4
Gnuplot用于绘图和小的算术计算,而在信号处理中查找峰值是一项信号处理任务,您需要使用类似GNU Octave的工具才能做出合理的结果。如果您加载freq.csv文件并针对MinPeakDistance使用一个合理的值运行findpeaks(),则会得到如下所示的结果:

Found most peaks

我用于生成上图的代码:

y = dlmread('freq.csv', ' ');
[peak_y, peak_x] = findpeaks(y(:,7), "MinPeakDistance", 40);
plot(y(:,1), y(:,7), y(peak_x,1), peak_y, '.r');

根据您的需求,findpeaks()可能已经足够了,可以查看help findpeaksdemo findpeaks以了解其他您可以调整的选项。


1
这个例子需要进行一些微调,但会对您有所帮助:
y2=y1=y0=NaN
stat "data/freq.csv" using (y2=y1,y1=y0,y0=$7,(y1>y2&&y1>y0?y1:NaN)) prefix "data"

现在,在变量data_records中,您应该获得第7列中本地最大值的计数。
您可以通过以下方式打印:
print data_records

为了更好地理解,我在这里发布正弦函数的一个示例。
set table 'test.dat'
plot sin(x)
unset table
x2=x1=x0=NaN 
y2=y1=y0=NaN
plot 'test.dat' using (x2=x1,x1=x0,x0=$1,x1):(y2=y1,y1=y0,y0=$2,(y1>y2&&y1>y0?y1:NaN)) w p,  'test.dat' u 1:2 w l

需要绘制正弦曲线以及最大值点。

如果有多个点具有相同的值:

x2=x1=x0=NaN
y2=y1=y0=NaN
plot 'freq.csv' u 0:7 w l, '' using (x2=x1,x1=x0,x0=$0,x1):(y2=y1,y1=y0,y0=$7,(y1>=y2&&y1>y0?y1:NaN)) w p

or

plot 'freq.csv' u 0:7 w l, '' using (x2=x1,x1=x0,x0=$0,x1):(y2=y1,y1=y0,y0=$7,(y1>y2&&y1>=y0?y1:NaN)) w p

根据你想要计算山峰的高度是在高原的哪一侧,计算山峰高度会有所不同。 stat 命令变成了:
stat 'freq.csv'  using (y2=y1,y1=y0,y0=$7,(y1>=y2&&y1>y0?y1:NaN)) prefix "data"

为什么要用 sin(x)?我不太明白。你能按照我的问题中的示例代码进行编辑吗?谢谢! - Mahsolid
我已经更新了答案。关于sin的第二部分只是为了让它更清晰,因为在你的数据片段中,第7列没有局部最大值。但你只是问了一种计数的方法,而不是绘制它们的方法。 - bibi
你的数据文件还有一个小问题,它是逗号分隔的数据,因此你需要告诉gnuplot这一点:set datafile separator ',' - bibi
默认情况下,gnuplot会查找空格,因此您不需要做任何操作。如果仍然有问题,请通过更新问题发布要绘制的数据。 - bibi
好的,我们在这里遇到了一个问题。请学习如何启动gnuplot脚本和bash脚本。帮助你变得困难了。分开处理问题。只需使用gnuplot控制台并在那里键入命令即可。在这里,您的bash正在扩展gnuplot$0变量。 - bibi
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接