我知道使用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
但这样的情节会出现在不同的窗口......
答案 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命令来设置样式。