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

Gnuplot: data normalization of multiple dataset in one file

图像一个文件包含 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 更友好的方法。任何建议表示赞赏。

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

在 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

结果: