我有一个这种格式的文件
0 R1 R2 R3 R4
w1 I1 I2 I3 I4
w2 I1 I2 I3 I4
w3 I1 I2 I3 I4
在许多波长 w 中具有半径 R 和强度 I 的值。我想以二维方式绘制,第 1 行(半径)在 x 轴上,第 3 行在 y 轴上(选择 w2)。
如何绘制每行?不是每列
这可能不是最优雅的解决方案,但您可以首先过滤这两行(包含 x 值的标题和与感兴趣的波长相对应的行),并排打印它们,最后使用 Gnuplot 绘制此辅助数据。
为此,策略是创建一个名为的脚本,例如filter.awk
在要执行 Gnuplot 的目录中,包含以下内容:
NR==1{
N = NF-1;
for(i=1;i<=N;i++) x[i] = $(i+1);
next;
}
$1==w{
printf "#%f\n", $1;
for(i=1;i<=N;i++) print x[i], $(i+1);
printf "\n";
}
这会记住第一行的 x 值并将它们存储在数组中x
。波长通过变量作为命令行参数传递(见下文)w
。如果数据中的第一列等于w
,然后脚本生成两列:第一列中的 x 值,第二列中的 y 值(取自当前行)。
在 Gnuplot 中,您可以将其用作:
plot \
'<gawk -v w=100 -f filter.awk data.dat' w l
where data.dat
将是您的输入数据和值100
代表应该被过滤的波长。
为了概括这一点,我们可以这样做:
cmd(w)=sprintf('<gawk -v w=%f -f filter.awk test.dat', w);
plot for [w in "100 200"] cmd(w+0) w l t sprintf('wave length of %.1f', w+0)
这里,绘图命令是通过cmd
函数接受一个表示波长的参数。然后,绘图命令循环遍历波长“列表”,并使用自定义标题单独绘制它们。该声明w+0
此处用于显式转换字符串值w
到一个数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)