Gnuplot:一个文件中多个数据集的数据归一化

问题描述 投票:0回答:1

对一个包含250个数据集的文件进行映像,这些数据集的长度(2000 + -500)行和11列不等。这里是一个综合的小例子:

file.sum:

0.00000e+00      9.51287e-09
1.15418e-04      8.51287e-09
4.16445e-04      7.51287e-09
8.53721e-04      6.51287e-09
1.42697e-03      5.51287e-09
1.70302e-03      4.51287e-09
2.27189e-03      3.51287e-09
2.54732e-03      1.51287e-09
3.11304e-03      0.51287e-09


0.00000e+00      13.28378e-09 
1.15418e-04      12.28378e-09 
3.19663e-04      11.28378e-09 
5.78178e-04      10.28378e-09 
8.67479e-04      09.28378e-09 
1.20883e-03      08.28378e-09 
1.58817e-03      07.28378e-09 
1.75840e-03      06.28378e-09 
2.21069e-03      05.28378e-09 

我想显示每10个数据集并将其标准化为第一个元素。要标准化的第一个值是9.51287e-09,第二个值是13.28378e-09。当然,有了这个庞大的数据集,我无法手动执行甚至无法拆分文件。

到目前为止,我获得了十分之一的数据集,但是通过规范化,我确实遇到了问题。

#!/usr/bin/gnuplot

reset

set xrange [0:0.1]

plot for [val=1:250:10] 'file.sum' i val u 1:11 w l

此示例的工作:

plot.gp:

#!/usr/bin/gnuplot

reset

set xrange [0:0.01]

plot for [val=1:2:1] 'file.sum' i val u 1:2 w l

我在以下地方找到了一些提示:

我想您可以编写awk脚本来处理此问题,但是可能有一种更gnuplot友好的方式。任何建议表示赞赏。

bash gnuplot
1个回答
1
投票

假设您有一个文件,每个数据节由两个或更多空行分隔,则可以使用下面的脚本。

在gnuplot控制台中,检查help pseudocolumnscolumn(-2)告诉您您位于哪个块中,column(0)告诉您您所在的块中哪一行(从0开始计数)。定义一个执行以下操作的函数Normalized(n):如果您在子块的第一行中,请将column(n)的值放入变量y0中。现在,该块的所有值都将被y0除。还要检查help ternary

如果要为图块添加图例,则可以绘制一个虚拟图,实际上是绘制NaN(即不绘制图,但要为键输入一个条目。

代码:

### normalize each block by its first value
reset session
set colorsequence classic

$Data <<EOD
0.00000e+00      9.51287e-09
1.15418e-04      8.51287e-09
4.16445e-04      7.51287e-09
8.53721e-04      6.51287e-09
1.42697e-03      5.51287e-09
1.70302e-03      4.51287e-09
2.27189e-03      3.51287e-09
2.54732e-03      1.51287e-09
3.11304e-03      0.51287e-09


0.00000e+00      13.28378e-09 
1.15418e-04      12.28378e-09 
3.19663e-04      11.28378e-09 
5.78178e-04      10.28378e-09 
8.67479e-04      09.28378e-09 
1.20883e-03      08.28378e-09 
1.58817e-03      07.28378e-09 
1.75840e-03      06.28378e-09 
2.21069e-03      05.28378e-09 
EOD

Normalized(n) = column(n)/(column(0)==0 ? y0=column(n) : y0)

plot $Data u 1:(Normalized(2)):(myBlocks=column(-2)+1) w lp pt 7 lc var notitle, \
     for [i=0:myBlocks-1] '' u 1:(NaN) w lp pt 7 lc i+1 ti sprintf("Block %d",i)
### end of code

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.