Gnuplot绘制两列之间的差异图表

4

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

现在,我想绘制一个图表来显示x vs(yA-yB)。gnuplot是否提供相应的命令?

还有一件事,假设xA和xB不同。我该如何绘制一个图表,在x轴上包含xA和xB中的所有元素,y轴是相应y组件之间的差异?


xA和xB项目是否总是完全匹配,包括字符?或者5.0000可以与5.0001合并吗? - Phil H
它们完全相同。合并的列是无符号整数。 - prathmesh.kallurkar
“所有同时存在于两个集合中的元素”-- 对我来说这句话有歧义。你是想要并集还是交集呢?听起来你想要交集,但是以防万一你需要并集,我也提供了一个解决方案。 - mgilson
2个回答

9

首先,在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使用的是字母数字排序方式,会导致行与行之间交叉。


如果这对于大量数据的情况下运行变得比较慢(三种排序方式),那么使用Perl/Python脚本可能会更好。另外,第一和第二种排序方式可以是数字排序,从而避免第三次排序吗? - Phil H
@PhilH:不幸的是,join需要按字母数字排序(如已经提到的)。试一下就知道了。如果有任何复杂情况,我也会选择更高级的语言(在我的情况下是Perl)。 - choroba

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) #...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接