(编辑:删除了直方图,不相关且令人困惑。)
我想要一个可以显示统计数据的 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
现在我的问题/问题是:
感谢您的帮助!
答案 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集中在两个箱图中的第一个。
输出
如果您不想更改数据文件并且可以使用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 # ....