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