2

假设我有两个格式如下的文件:
x --- y
0 --- 2
1 --- 2.4
2 --- 3.6
y 的值不同。有没有办法绘制一个图,即对于每个 x,两个文件之间 y 的最大值?

不知道是否充分解释了我的自我。

我正在尝试使用条件句,但找不到任何可以让我在 2 个不同文件中搜索的表达式

4

2 回答 2

3

仅使用 gnuplot 无法将两个或多个文件组合在一个绘图中。您必须使用外部工具来执行此操作,例如命令行实用程序paste

max(x, y) = (x > y ? x : y)
plot '< paste fileA.txt fileB.txt' using 1:(max($2, $4))

这些y值包含在第二列和第四列中。

下一个版本使用python脚本numpy来连接文件,但任何其他脚本语言也可以:

"""paste.py: merge lines of two files."""
import numpy as np
import sys

if (len(sys.argv) < 3):
    raise RuntimeError('Need two files')

A = np.loadtxt(sys.argv[1])
B = np.loadtxt(sys.argv[2])

np.savetxt(sys.stdout, np.c_[A, B], delimiter='\t')

要绘图,请使用:

max(x, y) = (x > y ? x : y)
plot '< python paste.py fileA.txt fileB.txt' using 1:(max($2, $4))
于 2013-09-29T18:48:36.030 回答
0

只是为了记录,gnuplot 有一种方法只能两个文件中获取最大值。诚然,对于 gnuplot 4.6.0,这是一种解决早期版本限制的疯狂方式。gnuplot 4.6.0 没有数据块和绘图样式with table,因此您必须使用大量临时文件。也许代码仍然可以简化。

当然,使用 Linux 工具或在 Windows 上安装是更有效的方法,例如 GnuWin 中的CoreUtils,但使用 gnuplot-only 你肯定是平台独立的,无需额外安装。

假设:两个文件具有相同的 x 值

数据:

SO19079146_1.dat

1   1.1
2   2.1
4   1.5
6   1.3
7   0.2
8   1.5
9   2.1

SO19079146_2.dat

1   2.1
2   2.5
4   1.5
6   0.3
7   0.7
8   1.0
9   1.4

代码 1:(gnuplot 5.2.0)

### find the maximum out of two files/datablocks (gnuplot>=5.2.0)
reset session

FILE1 = 'SO19079146_1.dat'
FILE2 = 'SO19079146_2.dat'

set table $Data1
    plot FILE1 u 1:2 w table
set table $Data2
    plot FILE2 u 1:2 w table
unset table
set print $Data3
    do for [i=1:|$Data1|] {
        print sprintf("%s %s",$Data1[i],$Data2[i])
    }
set print

set offset 1,1,1,1
Max(col1,col2) = column(col1)>column(col2) ?  column(col1) : column(col2)

plot $Data3 u 1:(Max(2,4)) w lp pt 7 lw 8 lc "grey" ti "Max", \
     $Data1 u 1:2 w lp pt 7 lc "red"  ti "Data1", \
     $Data2 u 1:2 w lp pt 7 lc "blue" ti "Data2"
### end of code

代码 2:(gnuplot 5.0.0)

### find the maximum out of two files/datablocks (gnuplot>=5.0.0)
reset session

FILE1 = 'SO19079146_1.dat'
FILE2 = 'SO19079146_2.dat'

set table $Data1
    plot FILE1 u 1:2 w table
set table $Data2
    plot FILE2 u 1:2 w table
unset table

set table $Temp3
    plot $Data1 u ($0+0.1):1 w table
    plot $Data1 u ($0+0.2):2 w table
    plot $Data2 u ($0+0.3):2 w table
set table $Temp4
    plot $Temp3 u 1:2 smooth freq
set table $Temp5
    GetX(col1,col2) = (x0=x1,x1=x2,x2=column(col1),y0=y1,y1=y2,y2=column(col2), floor(x0)==floor(x2) ? y0 : NaN)
    plot x1=x2=y1=y2=NaN $Temp4 u (GetX(1,2)):(y1>y2 ? y1 : y2) w table
set table $Data3
    set datafile missing "nan"
    plot $Temp5 u 1:2 w table
unset table

set offset 1,1,1,1

plot $Data3 u 1:2 w lp pt 7 lw 8 lc "grey" ti "Max", \
     $Data1 u 1:2 w lp pt 7 lc "red"  ti "Data1", \
     $Data2 u 1:2 w lp pt 7 lc "blue" ti "Data2"
### end of code

代码 3:(gnuplot 4.6.0)

### find the maximum out of two files/datablocks (gnuplot 4.6.0)
reset

FILE1 = 'SO19079146_1.dat'
FILE2 = 'SO19079146_2.dat'

stats FILE1 u 0 nooutput
N = int(STATS_records/STATS_blocks)   # get number of lines per subblock

set table FILE1."2"
    plot FILE1 u ($0+0.1):1
    plot FILE1 u ($0+0.2):2
    plot FILE2 u ($0+0.3):2
set table FILE1."3"
    plot FILE1."2" u 1:2 smooth freq
set table FILE1."4"
    x1=x2=y1=y2=NaN
    myValueX(col) = (x0=x1,x1=x2,x2=column(col), r=int($0-2)/N, r<1 ? x0 : r<2 ? x1 : x2)
    myValueY(col) = (y0=y1,y1=y2,y2=column(col), r<1 ? y0 : r<2 ? y1 : y2)
    plot FILE1."3" u (myValueX(1)):(myValueY(2))
set table FILE1."5"
    plot FILE1."4" u 1:2 every ::2 smooth freq
set table FILE1."6"
    GetX(col1,col2) = (x0=x1,x1=x2,x2=column(col1),y0=y1,y1=y2,y2=column(col2), \
                       floor(x0)==floor(x2) ? y0 : 1/0)
    plot x1=x2=y1=y2=NaN FILE1."5" u (GetX(1,2)):(y1>y2 ? y1 : y2)
unset table

set offset 1,1,1,1

plot FILE1."6" u 1:2 every 3::2 w lp pt 7 lw 8 lc rgb "grey" ti "Max", \
     FILE1 u 1:2 w lp pt 7 lc rgb "red"  ti "Data1", \
     FILE2 u 1:2 w lp pt 7 lc rgb "blue" ti "Data2"
### end of code

结果:(与上述所有版本相同)

在此处输入图像描述

于 2022-02-02T10:03:16.170 回答