gnuplot rowstacked 直方图:如何计算标准偏差并将其放在条形图的顶部?

gnuplot rowstacked histogram: how to calculate and put standard deviations on top of bars?

我问的是一个新问题,因为 中的更新没有受到太多关注。 相关问题:gnuplot histogram: How to put values on top of bars and

t.dat 文件如下所示:

          260.37
          260.04
          261.53
          261.32
          260.19
          260.49
          260.43
          260.59
          260.26
          260.68
          260.28
          259.93
          260.82
          259.50
          260.29
          260.52
          260.30
          259.91
          262.24
          260.58
          260.74
          260.22
          261.66
          260.31
          260.99
          259.79
          260.90
          259.88
          260.19
          261.50
          259.32
          260.79
          259.94
          260.35
          260.03
          260.07
          261.86
          261.09
          260.60
          260.15
           75.17
           75.16
           75.33
           75.31
           75.34
           75.04
           75.49
           75.25
           75.27
           75.32
           75.10
           75.75
           75.58
           74.86
           75.19
           75.44
           75.29
           75.31
           75.55
           75.91
           75.39
           75.65
           75.85
           75.67
           75.62
           74.87
           75.64
           75.69
           75.13
           77.76
           75.31
           74.87
           75.75
           75.27
           75.61
           74.84
           75.72
           75.40
           74.96
           75.33
           67.20
           67.26
           68.15
           68.67
           68.88
           67.56
           67.71
           66.87
           68.74
           67.32
           66.92
           69.62
           67.29
           66.87
           68.33
           67.73
           68.66
           68.75
           67.00
           67.22
           66.93
           68.81
           67.29
           67.18
           67.33
           67.91
           70.34
           67.15
           68.37
           69.60
           69.74
           69.62
           67.33
           66.79
           67.90
           67.39
           69.88
           68.48
           68.96
           67.36
           47.82
           47.54
           47.74
           47.95
           47.65
           47.71
           47.64
           47.71
           47.47
           48.19
           47.82
           48.06
           47.88
           48.22
           48.31
           47.58
           47.41
           47.85
           47.71
           47.93
           48.34
           47.95
           48.70
           47.58
           47.86
           47.96
           47.80
           48.00
           47.51
           47.56
           47.50
           47.52
           47.47
           47.76
           47.53
           48.27
           47.26
           47.79
           47.67
           47.57

目标是计算文件 t.dat 中四组数字的标准差,并将它们显示为构成直方图的条形上方的标签。第一组:1-40行 第二组:41-80行 第三组:81-120行 第四组:121-160行

到目前为止,我只能手动完成此操作。我已将所需的行范围拆分为单独的文件,即。 e. tempos1.dat、tempos4.dat、tempos9.dat 和 tempos16.dat,使用统计数据计算了它们的标准偏差并将它们显示为标签。

代码如下:

set term pngcairo
set out 'st-dev.png'
unset key
stats "tempos1.dat" using 1 name "A"
stats "tempos4.dat" using 1 name "B"
stats "tempos9.dat" using 1 name "C"
stats "tempos16.dat" using 1 name "D"
set label "0.6234" at 28,275
set label "0.4666" at 90,90
set label "0.9836" at 149,85
set label "0.2947" at 210,65
set boxwidth 0.9 relative
set style data histogram
set style histogram cluster gap 1
set style fill solid 1.0 border -1
set xrange [0:250]
set xtics ("1" 40, "4" 100, "8" 160, "16" 220)
plot for [i=1:4] 't.dat' using ([=11=]+20+(i-1)*61):1 every ::((i-1)*40)::(i*40-1) with boxes lt i

我阅读了相关的帖子,似乎要将标准开发人员放在条形图上方,我所要做的就是在 using 子句中添加一个包含变量的列存储 std_dev,但目前它是通过手动拆分的文件计算的。 这是所需的输出:

我该怎么做?

您可以使用 do for 遍历四个块,使用与 [=15= 中已有的相同 usingevery 设置调用 stats ] 命令。然后,在每次迭代中,使用 stats 给你的许多值设置适当的标签:

  • STATS_mean_x 作为标签的 x 坐标
  • STATS_max_y 作为 y 坐标(加上 1 个字符高度的偏移量,用 set label ... offset 0,1 完成)
  • STATS_stddev_y 作为计算的标准偏差本身:
set term pngcairo
set out 'st-dev.png'
unset key
set boxwidth 0.9 relative
set style fill solid 1.0 border -1
set xlabel "Número de processos"
set ylabel "Tempo de execução (s)"
set xrange [0:250]
set xtics ("1" 40, "4" 100, "8" 160, "16" 220)

do for [i=1:4] {
    stats 't.dat' using ([=10=]+20+(i-1)*61):1 every ::((i-1)*40)::(i*40-1) nooutput
    set label i sprintf('%.4f', STATS_stddev_y) center at STATS_mean_x,STATS_max_y offset 0,1
}

plot for [i=1:4] 't.dat' using ([=10=]+20+(i-1)*61):1 every ::((i-1)*40)::(i*40-1) with boxes lt i