3

我知道,如果我有一个多列文件,我可以使用 xmgrace 将某个列绘制为另一个列的函数(例如,3 vs 1)

xmgrace -block file.dat -bxy 1:3

如果我想在同一个窗口中绘制 2vs1 和 3vs1,我将简单地使用命令

xmgrace -block file.dat -bxy 1:2 -block file.dat -bxy 1:3

但是,如果文件包含大量列,并且我想在同一窗口中将所有列绘制为第一个(2vs1、3vs1、4vs1 等)的函数,则使用此命令变得不切实际。

是否有一个简单的命令可以将文件中的所有列绘制为第一个(2vs1、3vs1 等)的函数?

我试过了

for i in {2..n}; do xmgrace -block file.dat -bxy 1:$i; done

但这样的情节将出现在不同的窗口......

4

2 回答 2

4

nxy 选项旨在执行此操作。

xmgrace -nxy file.dat

使用此选项,xmgrace 将 file.dat 的第一列读取为 x 数据,每隔一列读取为 y(i)-data,并在同一图表上绘制 y(i) 与 x(默认使用不同的颜色)。

于 2016-09-19T20:34:16.177 回答
1

简短的回答:

这将为每个数据系列与第 1 列创建单独的绘图文件:

for i in {2..7}; do `gracebat -nosafe -hdevice PNG -printfile $i.png -block a.txt -bxy 1:$1`; done

长答案:

如果您想在相同的轴上绘制所有列(从第 2 列到包括第 7 列)与第 1 列,您可以这样做:

for i in {2..7}; do echo -n " -block file.dat -bxy 1:$i"; done | xargs xmgrace

但由于您的问题是要求单独的地块,我们可以这样做:

for i in {2..7}; do echo -n " -block file.dat -bxy 1:$i" | xargs xmgrace; done

或者这个,它给出相同的结果但更简单:

for i in {2..7}; do echo -n `xmgrace -block file.dat -bxy 1:$i`; done

然而,这不是很实用,因为各个地块一个一个地出现,并且每个地块都必须关闭才能出现下一个。

最好让 xmgrace 以批处理模式运行并为您保存每个绘图的图像。您可以使用 xmgrace 批处理文件并使用gracebat可执行文件来执行此操作。

for i in {2..7}; do `gracebat -nosafe -batch save.bfile -block a.txt -bxy 1:$1`; done

这在批处理模式下使用与以前相同的数据调用 Grace,但运行保存在 中的批处理命令save.bfile,其中包含:

PRINT TO "out.ps"
PRINT

明显的问题是每次新的迭代都会覆盖out.pspostscript 文件,因为输出文件的名称在我们的批处理文件中是硬编码的!所以你只能看到文件中的最后一个。幸运的是,我们可以在每次调用 Gracebat 之前使用 sed 修改批处理文件!

for i in {2..7}; do `sed -e "s/outName/${i}/g" save.bfile > new.bfile`; `gracebat -nosafe -batch new.bfile -block a.txt -bxy 1:$1`; done

save.bfile 现在包含

PRINT TO "outName.ps"
PRINT

并且字符串outName被 $i 替换。

您现在应该有大量 .ps 文件,其中包含您的绘图。玩弄批处理文件以便用它做更多的事情。有关您可以包含的更多命令,请参阅此页面,包括如何更改输出文件格式。

或者,您可以完全跳过使用批处理文件:

for i in {2..7}; do `gracebat -nosafe -hdevice PNG -printfile $i.png -block a.txt -bxy 1:$1`; done

如果你有一个参数文件,你也可以添加 -param 命令来设置样式。

于 2016-08-19T11:40:56.587 回答