Gnuplot - 在一张图片中比较多个箱线图对

Gnuplot - Comparing several boxplot pairs in one picture

(编辑:删除了直方图,不相关且令人困惑。)

我想要一个可以可视化统计数据的箱线图。我为两种类型的数据制作了两个数据文件。在第一列中写入水平,即 x 值,在第二列中写入值。每个数据点一行,每个级别几个点。我想要相同级别在不同文件比较中彼此相邻。我想出了以下代码:

Tournament5 = "#99ffff"; Sigmascaling = "#4671d5"
set terminal pngcairo
set output "generations_dev.png"
set yrange [0:17.5]
set ylabel "Maximum Compactness of Best Solutions"
set xlabel "Number of Generations"

set autoscale fix

set style fill solid 0.25 border -1
set style boxplot nooutliers pointtype 7 separation 3
set style data boxplot
set boxwidth 1

plot "generation_tour.data" using (1.0):2:(0):1, "generation_sig.data" using (2.0):2:(0):1

这给了我下面的图片:

现在我的problems/questions是:

感谢您的帮助!

Data File generation_sig.data

Data File generation_tour.data

好吧,这似乎有点棘手。

两件事:gnuplot 似乎无法为您的绘图案例中的 x 值生成正确的自动缩放。您需要设置一个明确的 xrange,就像您已经为 yrange 所做的那样。第二:gnuplot 似乎总是使用 levels 列中给出的值作为 xticlabel,而不给您更改以抑制它们。

在这里我给你一个可能的解决方案,它依赖于数据文件将第一列中具有相等值的块放在一起,并通过两个空行与具有不同值的其他块分开,以便您可以访问每个块通过 index 关键字并遍历它们:

...
"0" 14.49786677484523
"0" 14.691225516174955


"20" 10.28997920528754
"20" 8.764312035687594
...

然后您可以使用以下脚本在您想要的位置绘制所有这些箱线图:

    Tournament5 = "#99ffff"; Sigmascaling = "#4671d5"
set terminal pngcairo
set output "generations_dev.png"
set yrange [0:17.5]
set ylabel "Maximum Compactness of Best Solutions"
set xlabel "Number of Generations"

set autoscale xfix

set style fill solid 0.25 border -1
set style boxplot nooutliers pointtype 7
set style data boxplot
set boxwidth 1

stats "generation_sig.data" using 2 nooutput

plot for [i=0:STATS_blocks-1] "generation_sig.data" using (3*i):2 index i lt 1 title (i==0 ? 'Sigmascaling' : ''),\
     for [i=0:STATS_blocks-1] "generation_tour.data" using (3*i+1):2 index i lt 2 title (i==0 ? 'Tournament 5' : ''),\
     for [i=0:STATS_blocks-1] "generation_sig.data" using (3*i+0.5):(-1):xticlabel(1) index i w l notitle

stats调用用于统计数据文件中包含的块数。第三个 plot 明确地放在定义的范围之外。它只在两个箱线图的中间产生 xtics。你也可以使用

plot for [i=0:STATS_blocks-1] "generation_sig.data" using (3*i):2:(0):1 index i lt 1,\
     for [i=0:STATS_blocks-1] "generation_tour.data" using (3*i+1):2 index i lt 2

这将使您的 xtics 集中在两个箱线图的第一个下方。

输出为

如果您不想更改数据文件并且可以使用 awk,那么您也可以使用

即时添加空行
cmd(file) = '< awk ''{if (NR != 1 &&  != prev) print "\n"; prev=; print}'' '.file
plot for [i=0:STATS_blocks-1] cmd("generation_sig.data") using (3*i):2 index i lt 1 # ....