我有两个文件A和B。这两个文件都包含2列,x和y。
现在,我想绘制一个图表来显示x vs(yA-yB)。gnuplot是否提供相应的命令?
还有一件事,假设xA和xB不同。我该如何绘制一个图表,在x轴上包含xA和xB中的所有元素,y轴是相应y组件之间的差异?
我有两个文件A和B。这两个文件都包含2列,x和y。
现在,我想绘制一个图表来显示x vs(yA-yB)。gnuplot是否提供相应的命令?
还有一件事,假设xA和xB不同。我该如何绘制一个图表,在x轴上包含xA和xB中的所有元素,y轴是相应y组件之间的差异?
首先,在bash中使用join
对文件进行预处理:
join <(sort -k1,1 file1) <(sort -k1,1 file2) > file3
对于IT技术相关内容,分类文件是必要的,否则join
将无法正常工作。
然后您可以使用结果绘制图形:
plot '< sort -n file3' using 1:($2-$3) with lines
再次强调,这里需要数字排序,因为join
使用的是字母数字排序方式,会导致行与行之间交叉。
join
需要按字母数字排序(如已经提到的)。试一下就知道了。如果有任何复杂情况,我也会选择更高级的语言(在我的情况下是Perl)。 - choroba我认为这可能是使用 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
#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) #...