【问题标题】:gnuplot plot difference of 2 columns2列的gnuplot绘图差异
【发布时间】:2012-05-28 17:46:36
【问题描述】:

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

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

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

【问题讨论】:

  • xA 和 xB 项是否总是完全匹配,直至字符?还是可以将 5.0000 与 5.0001 合并?
  • 它们完全相同。合并的列是一个无符号整数。
  • “两者中的所有元素”——这(对我来说)是模棱两可的。你想要工会还是十字路口?听起来你想要交叉点,但如果你想要联合,我在下面提供了一个解决方案。

标签: plot gnuplot


【解决方案1】:

首先,在 bash 中预处理带有join 的文件:

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

对文件进行排序是必不可少的,否则join 将不起作用。

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

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

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

【讨论】:

  • 如果这对于大数据来说很慢(3 种),那么 perl/Python 脚本可能是更好的选择。另外,前两个排序不能是数字,从而避免第三个排序吗?
  • @PhilH:不幸的是,join 需要字母数字排序(如前所述)。试试看。如果有任何复杂性,我也会寻求更高级的语言(在我的例子中是 Perl)。
【解决方案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) #...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2015-04-28
    相关资源
    最近更新 更多