Xmgrace:将多列文件中的所有列绘制为第一个

时间:2016-07-01 10:19:02

标签: xmgrace

我知道使用xmgrace如果我有一个多列文件,我可以使用命令将某个列绘制为另一个列的函数(例如,3对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

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

2 个答案:

答案 0 :(得分:3)

nxy选项旨在实现此目的。

xmgrace -nxy file.dat

使用此选项,xmgrace将file.dat的第一列读取为x-data,将每个其他列读取为y(i)-data,并在同一图表上绘制y(i)vs x(默认情况下使用不同的颜色) )。

答案 1 :(得分:1)

简答:

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

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

答案很长:

如果您想绘制所有列(从第2位到第7列包括第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

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

PRINT TO "out.ps"
PRINT

这个问题的一个明显问题是每个新的迭代都会覆盖out.ps postscript文件,因为输出文件的名称在我们的批处理文件中是硬编码的!所以你只看到文件中的最后一个。幸运的是,我们每次调用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文件,里面有你的情节。使用批处理文件,以便用它做更多的事情。有关可以包含的更多命令,请参阅this page,包括如何更改输出文件格式。

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

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

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