我在文件中有一个数据,我想使用 gnuplot 进行绘图。在文件中,有 3 个数据集由两个空行分隔,以便 gnuplot 可以通过“索引”区分数据集。我可以通过 'plot' 命令的 'index' 选项分别绘制三个数据集。但是,我不确定如何绘制所有三个数据集的第二列总和的数据?
注意:所有三个数据集都有相同的 x 数据,即第 1 列
为此,最简单的方法是更改文件格式。Gnuplot 可以很好地处理列。由于您正在共享 x 数据,因此您可以将文件格式更改为具有四列(假设您只是在绘制 (x,y) 数据):
<x data> <y1 data> <y2 data> <y3 data>
并使用类似的命令
plot 'data.dat' using 1:2 title 'data 1', \
'' u 1:3 t 'data 2', \
'' u 1:4 t 'data 3', \
'' u 1:($2+$3+$4) t 'sum of datas'
列规范中括号内的美元符号using
允许您对列数据添加/减去/执行其他功能。
这样您的数据文件也会更小,因为您不会重复 x 数据。
@Youjun Hu,永远不要说“没有办法”用 gnuplot 做某事。大多数情况下,只有 gnuplot 有一种方法,有时可能不明显或有时有点麻烦。
数据: SO16861334.dat
1 11
2 12
3 13
4 14
1 21
2 22
3 23
4 24
1 31
2 32
3 33
4 34
代码 1:(适用于 gnuplot 4.6.0,需要对 >=4.6.5 进行一些修改)
在 gnuplot 4.6.0(OP 问题时的版本)中没有数据块,也没有plot ... with table
. 下面的示例仅适用于 3 个子数据集,但可以适用于其他数字。但是,使用这种方法将难以处理任意数量的子数据集。
### calculate sum from 3 different (sub)datasets, gnuplot 4.6.0
reset
FILE = "SO16861334.dat"
stats FILE u 0 nooutput
N = int(STATS_records/STATS_blocks) # get number of lines per subblock
set table FILE."2"
plot FILE u 1:2
set table FILE."3"
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 FILE."2" u (myValueX(1)):(myValueY(2))
unset table
set key top left
set offset graph 0.1, graph 0.1, graph 0.2, graph 0.1
plot for [i=0:2] FILE u 1:2 index i w lp pt 7 lc i+1 ti sprintf("index %d",i), \
FILE."3" u 1:2 every ::2 smooth freq w lp pt 7 lc rgb "magenta" ti "sum"
### end of code
代码 2:(适用于 gnuplot>=5.0.0)
此代码适用于任意数量的子数据集。
### calculate sum from 3 different (sub)datasets, gnuplot>=5.0.0
reset
FILE = "SO16861334.dat"
set table $Data2
plot FILE u 1:2 w table
unset table
set key top left
set offset graph 0.1, graph 0.1, graph 0.2, graph 0.1
set colorsequence classic
plot for [i=0:2] FILE u 1:2 index i w lp pt 7 lc i+1 ti sprintf("index %d",i), \
$Data2 u 1:2 smooth freq w lp pt 7 lc rgb "magenta" ti "sum"
### end of code
结果:(对于带有 gnuplot 4.6.0 的 Code1 和对于 gnuplot 5.0.0 的 Code2 的结果相同)