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
我发现的一些提示:
- Gnuplot: data normalization
我想您可以编写一个 awk 脚本来处理这个问题,但可能有一种对 gnuplot 更友好的方法。任何建议表示赞赏。
假设您有一个文件,其中每个数据部分由两个或多个空行分隔,您可以使用下面的脚本。
在 gnuplot 控制台中检查 help pseudocolumns
。 column(-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
结果:
图像一个文件包含 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
我发现的一些提示:
- Gnuplot: data normalization
我想您可以编写一个 awk 脚本来处理这个问题,但可能有一种对 gnuplot 更友好的方法。任何建议表示赞赏。
假设您有一个文件,其中每个数据部分由两个或多个空行分隔,您可以使用下面的脚本。
在 gnuplot 控制台中检查 help pseudocolumns
。 column(-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
结果: