Gnuplot - 比较一张图片中的几个箱图对

时间:2015-09-14 08:09:13

标签: gnuplot boxplot

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

我想要一个可以显示统计数据的 boxplot 。我为两种类型的数据制作了两个数据文件。在第一列中,写入级别(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

给了我以下图片: boxplot

现在我的问题/问题是:

  • 为什么x值没有向右伸展,而只向右伸展 中间?当我添加第二个文件时,会发生这种情况,只有一个文件使用图形的整个宽度。
  • 每对我只需要一个x标签,但我得到它两次,我怎么能压一个呢?

感谢您的帮助!

Data File generation_sig.data

Data File generation_tour.data

1 个答案:

答案 0 :(得分:2)

好吧,这似乎有点棘手。

两件事:似乎gnuplot无法为您的绘图案例中的x值生成正确的自动缩放。你需要设置一个像你已经为yrange做的显式xrange。第二: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明确地放在定义的yrange之外。它只在两个箱形图中间产生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集中在两个箱图中的第一个。

输出

enter image description here

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

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