假设我有两个格式如下的文件:
x --- y
0 --- 2
1 --- 2.4
2 --- 3.6
y 的值不同。有没有办法绘制一个图,即对于每个 x,两个文件之间 y 的最大值?
不知道是否充分解释了我的自我。
我正在尝试使用条件句,但找不到任何可以让我在 2 个不同文件中搜索的表达式
仅使用 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))
只是为了记录,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
结果:(与上述所有版本相同)