3

我有两个文件 A 和 B。两个文件都包含 2 列,x 和 y。

现在,我想绘制 x vs (yA - yB) 的图表。gnuplot 是否提供相同的命令?

还有一件事,假设 xA 和 xB 不一样。我应该如何绘制一个图表,其中 x 轴包含 xA 和 xB 中的所有元素,并且 y 轴的差异是对应的 y 分量?

4

2 回答 2

8

首先,使用joinbash 对文件进行预处理:

join <(sort -k1,1 file1) <(sort -k1,1 file2) > file3

对文件进行排序是必不可少的,否则join将无法正常工作。

然后您可以使用结果来绘制图形:

plot '< sort -n file3' using 1:($2-$3) with lines

同样,这里需要数字排序,因为join使用字母数字排序使线条相互交叉。

于 2012-05-22T08:58:40.887 回答
2

我认为这可能是一个很好的工作paste

plot "<paste A B" u 1:($2-$4) w points #whatever line style you want...
                  #xA #yA-yB

对于 xA != xB 的文件,我有点不清楚您是想仅绘制两者共有的点集(两组的交集)还是要绘制所有点(联合的集合)。工会很简单:

plot "<paste A B" u 1:($2-$4) w points ls 1,\
     "<paste A B" u 3:($2-$4) w points ls 1

仅使用 unix 命令行工具很难进行交集(特别是如果您想保留输入的顺序)

虽然使用 Python,但它并不算太糟糕......

#joinfiles.py
import sys
f1=sys.argv[1]
f2=sys.argv[2]
xA,yA=zip(*[map(float,line.split()) for line in f1.readlines()])
xB,yB=zip(*[map(float,line.split()) for line in f2.readlines()])
f1.close()
f2.close()
for i,x in enumerate(xA):
    if(x in xB):
        sys.stdout.write('%f %f %f\n'%(x,yA[i],yB[i]))

然后从gnuplot:

plot "<python joinfiles.py A B" u 1:($2-$3) #...
于 2012-05-22T12:25:24.470 回答