对一个包含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 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
结果: