我有一个非常庞大的文本文件,包含11列。由于我无法发布整个数据,因此我已将文本文件上传到公共仓库,可在此链接中找到:http://s000.tinyupload.com/?file_id=59483318155908771897
有没有办法在Linux中使用GNU plot计算峰值数?从上面的文本文件中,我将第一和第七列绘制为x和y列,其中峰值是第7个列的变体,这就是我感兴趣的内容。例如,计算频率峰值的数量,如下图所示。
这是我正在使用的简单绘图脚本。
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", \
感谢您的帮助。
答案 0 :(得分:4)
Gnuplot用于绘图和次要算术,在信号中找到峰值是一个信号处理任务,你需要像GNU Octave那样做一个合理的工作。如果您加载freq.csv
文件并在findpeaks()
上运行MinPeakDistance
并使用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 findpeaks
可能已足够,请参阅demo findpeaks
和inout
了解您可以调整的其他选项。
答案 1 :(得分: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列中的本地最大数量的COUNT。
您可以通过
打印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
或
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"