我有两个文件 A 和 B。两个文件都包含 2 列,x 和 y。
现在,我想绘制 x vs (yA - yB) 的图表。gnuplot 是否提供相同的命令?
还有一件事,假设 xA 和 xB 不一样。我应该如何绘制一个图表,其中 x 轴包含 xA 和 xB 中的所有元素,并且 y 轴的差异是对应的 y 分量?
首先,使用join
bash 对文件进行预处理:
join <(sort -k1,1 file1) <(sort -k1,1 file2) > file3
对文件进行排序是必不可少的,否则join
将无法正常工作。
然后您可以使用结果来绘制图形:
plot '< sort -n file3' using 1:($2-$3) with lines
同样,这里需要数字排序,因为join
使用字母数字排序使线条相互交叉。
我认为这可能是一个很好的工作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) #...