在 Gnuplot 中循环统计名称

Looping over stats name in Gnuplot

我将文件中的数据按块排列。我想将每个块中的所有数据连同块的平均值一起绘制在同一图上的单独线条上。

我能够使用带有 for 循环的绘图来显示数据

plot for [i=1:10] "F_vst.dat" every :::i::i u 1:2 w lines t i

但是当我尝试使用与

相同的格式包含统计数据时
stats for [i=1:10] ....

它给我一个错误,说是一个未定义的变量。

我尝试在 do for 循环中编写统计信息,但我需要为不同的块使用不同的名称。我尝试了两种方法:

do for [i=1:10] {
stats "F_vst.dat" every :::i::i u 2 name "F".i
}
plot for [i=1:10] "F_vst.dat" every :::i::i u 1:2 w lines t i, F.i_mean w dots

但这给了我一个错误,说 F 是一个未定义的变量。第二种方法:

do for [i=1:10] {
stats "F_vst.dat" every :::i::i u 2 name "F"
plot "F_vst.dat" every :::i::i u 1:2 w lines t i, F_mean w dots
}

但这只绘制了第一个块的数据,并忽略了所有其他块。

有更好的方法吗?

如果你有 gnuplot >=5.2 那么我会把统计值简单地放在一个数组中。也会有针对旧 gnuplot 版本的解决方案。请注意,数组中的索引从 1 开始,而数据块中的索引从 0 开始。 像这样:

代码:

### statistics in a loop
reset session

# create some test data
set print $Data
do for [i=1:10] {
    do for [j=1:20] {
        print sprintf("%g %g", j, rand(0)+i)
    } 
    print ""
}
set print

array F[10]
do for [i=1:10] {
    stats $Data u 2 every :::i-1::i-1 nooutput
    F[i] = STATS_mean
}
set key out Left

plot for [i=1:10] $Data u 1:2 every :::i-1::i-1 w lp pt 7 lc i notitle, \
     for [i=1:10] F[i] w l title sprintf("Mean% 3d: %g",i,F[i]) lc i
### end of code

结果: