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是:
- 为什么 x 值没有向右拉伸而是只向右拉伸
中间?当我添加第二个文件时会发生这种情况,只有一个文件会占用图形的整个宽度。
- 我每对只需要一个 x 标签,但我得到了两次,我该如何抑制一个?
感谢您的帮助!
好吧,这似乎有点棘手。
两件事: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 # ....
(编辑:删除了直方图,不相关且令人困惑。)
我想要一个可以可视化统计数据的箱线图。我为两种类型的数据制作了两个数据文件。在第一列中写入水平,即 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是:
- 为什么 x 值没有向右拉伸而是只向右拉伸 中间?当我添加第二个文件时会发生这种情况,只有一个文件会占用图形的整个宽度。
- 我每对只需要一个 x 标签,但我得到了两次,我该如何抑制一个?
感谢您的帮助!
好吧,这似乎有点棘手。
两件事: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 # ....