抛光gnuplot直方图

时间:2016-04-05 21:27:50

标签: gnuplot histogram

我试图使用1到12个线程绘制某些数据集1,2和3的执行时间。 基于其他合作者的提示,我已经设法绘制了一些内容,但仍然是原始的,需要进行一些修改。

test.dat文件如下所示:

7.979446
7.979782
7.980070
7.980209
7.980716
7.981428
7.982284
7.986656
7.987722
8.001152
56.394068
56.411380
56.417835
56.425779
56.426430
56.442289
56.447586
56.453845
56.480448
56.500974
89.251694
89.278013
89.281708
89.299754
89.300965
89.307755
89.342808
89.348788
89.374555
89.443212
4.002836
4.003149
4.003460
4.003638
4.003821
4.004005
4.004230
4.005415
4.005717
4.006178
28.228176
28.239830
28.240788
28.249284
28.256000
28.258078
28.262026
28.264375
28.268416
28.273207
44.659865
44.668623
44.671320
44.681847
44.686959
44.694352
44.699392
44.708551
44.709311
44.731599
2.672576
2.673274
2.673376
2.673550
2.673601
2.673844
2.674989
2.675926
2.676808
2.677280
18.832229
18.836510
18.836564
18.839250
18.846318
18.847400
18.849118
18.850751
18.859785
18.867247
29.795157
29.798674
29.803137
29.804717
29.806593
29.808391
29.823173
29.825312
29.830610
29.834788
2.006869
2.006896
2.007402
2.007455
2.007571
2.007576
2.007797
2.008056
2.008327
2.010466
14.123902
14.137294
14.143547
14.145535
14.145802
14.149070
14.150863
14.153041
14.158910
14.163958
22.366110
22.377555
22.381285
22.382443
22.397755
22.402830
22.405512
22.407027
22.408854
22.428611
1.607613
1.608379
1.608383
1.608388
1.608727
1.608875
1.608951
1.609643
1.609970
1.610055
11.317486
11.324436
11.326964
11.327802
11.328852
11.329350
11.331660
11.333145
11.344123
11.347258
17.916997
17.924367
17.927473
17.929957
17.931164
17.941486
17.946694
17.954824
17.960349
17.964670
1.342421
1.342613
1.342790
1.343102
1.343529
1.343624
1.343710
1.343854
1.345136
1.347415
9.441679
9.443007
9.450755
9.452555
9.454940
9.455060
9.456859
9.457250
9.460143
9.471149
14.927076
14.951473
14.953387
14.954076
14.960740
14.971557
14.972433
14.988446
14.998727
15.000089
1.152602
1.152828
1.152872
1.153022
1.153024
1.153126
1.153146
1.153598
1.154386
1.154684
8.101228
8.104056
8.111444
8.112540
8.120765
8.122927
8.123258
8.124685
8.126094
8.126341
12.814569
12.828172
12.840957
12.841054
12.841083
12.844525
12.848143
12.848671
12.863897
12.884744
1.009917
1.010277
1.010382
1.010674
1.011499
1.011569
1.011727
1.011749
1.012070
1.012181
7.094522
7.095445
7.107636
7.113403
7.113982
7.115782
7.115788
7.117909
7.118149
7.119460
11.213377
11.244623
11.246764
11.248645
11.251625
11.257971
11.274399
11.276169
11.281887
11.288210
0.899219
0.899579
0.899652
0.899709
0.899769
0.899830
0.900219
0.900231
0.900431
0.900500
6.328375
6.331140
6.332462
6.338253
6.338744
6.341830
6.346616
6.351038
6.352929
6.367343
10.013683
10.019828
10.022535
10.023297
10.055958
10.060335
10.062904
10.065623
10.066142
10.071990
0.810524
0.810584
0.810863
0.811074
0.811251
0.811642
0.811673
0.812207
0.812218
0.812428
5.683542
5.684000
5.686904
5.688421
5.698619
5.699549
5.704962
5.716741
5.717077
5.720054
9.013459
9.014580
9.026935
9.027847
9.028682
9.033721
9.048791
9.053777
9.054141
9.063900
0.738528
0.738681
0.739168
0.739263
0.739292
0.739330
0.739389
0.739759
0.739885
0.740058
5.178512
5.181581
5.182815
5.190749
5.192971
5.194582
5.195547
5.196638
5.199621
5.203723
8.204998
8.205462
8.217376
8.217634
8.232874
8.234680
8.242527
8.261343
8.267276
8.267413
0.678074
0.678121
0.678458
0.678525
0.679359
0.679681
0.679727
0.679983
0.680982
0.682098
4.743285
4.746411
4.746927
4.753897
4.758229
4.759577
4.761998
4.767569
4.772117
4.772698
7.533035
7.533890
7.539902
7.546736
7.552226
7.556848
7.557569
7.558419
7.565937
7.579489

以这种方式组织: 前10行是数据集1和1线程的执行时间;接下来的10个是数据集2和1个线程的时间; 10个下一个数据集3,1个线程,依此类推,最多可包含12个线程。

gnuplot脚本如下所示:

set boxwidth 0.7 relative
set style fill solid 1.0 noborder
set xtics ("1" 15, "2" 75, "3" 135, "4" 195, "5" 255, "6" 315, "7" 375, "8" 435, "9" 495, "10" 555, "11" 615, "12" 675)
unset key
set terminal png size 800,600 enhanced font "Helvetica,10"
set output 'output.png'
set xlabel "Number of threads"
set ylabel "Execution time"
plot for [i=1:12] 'test.dat' using ($0+(i-1)*60):1 every ::((i-1)*30)::(i*30-1) with boxes lt i

这个情节存在一些问题:

  • 数据集:我们可以看到每个数据集有10个执行,每个线程数。数据集1是最低值,ds 2是中值,ds 3是最高值。对于每个线程数而不是一种颜色,应该只有3种颜色,例如数据集1为红色,数据集2为绿色,数据集3为蓝色,这些应通过右上角的设置键通知。
  • 间距:绘图开始粘在左y轴上。在第一个直方图和左侧y轴之间应该有15个单位的间距,在数据集之间应该有几个单位,在线程数之间还有15个单位,在最后一个直方图和右边y轴之间有15个单位。 / LI>
  • xtics:xtics应考虑前面提到的间距。是否可以循环这些xtics的设置?

提前致谢。

更新

Matthew,基于您对第1点的断言,这里是按数据集排序的执行时间(数据集1:第1 - 120行;数据集2:行121 - 240;数据集3:行241 - 360);给定ds的前10行代表1个线程的执行时间,10个下一个代表2个线程,依此类推。

8.001152
7.981428
7.986656
7.979782
7.980070
7.987722
7.980716
7.980209
7.982284
7.979446
4.003821
4.003638
4.003149
4.005415
4.003460
4.002836
4.005717
4.006178
4.004005
4.004230
2.673844
2.673601
2.675926
2.674989
2.673274
2.677280
2.676808
2.673376
2.672576
2.673550
2.008327
2.007571
2.007797
2.007576
2.010466
2.008056
2.007402
2.006869
2.006896
2.007455
1.608951
1.609970
1.608875
1.608379
1.608383
1.608388
1.607613
1.608727
1.609643
1.610055
1.343102
1.342790
1.347415
1.342613
1.343710
1.343529
1.345136
1.343854
1.342421
1.343624
1.153126
1.153022
1.152828
1.154386
1.152602
1.152872
1.153024
1.154684
1.153598
1.153146
1.011499
1.012181
1.011727
1.012070
1.011569
1.009917
1.011749
1.010674
1.010277
1.010382
0.899709
0.900500
0.900231
0.899769
0.899652
0.900219
0.900431
0.899219
0.899579
0.899830
0.811642
0.811074
0.812207
0.810524
0.812218
0.811673
0.810863
0.812428
0.811251
0.810584
0.738681
0.739885
0.740058
0.739330
0.739168
0.739263
0.739292
0.738528
0.739389
0.739759
0.679359
0.678121
0.680982
0.682098
0.679681
0.678525
0.679727
0.679983
0.678458
0.678074
56.425779
56.417835
56.426430
56.500974
56.447586
56.411380
56.453845
56.480448
56.442289
56.394068
28.258078
28.249284
28.264375
28.273207
28.228176
28.268416
28.240788
28.256000
28.262026
28.239830
18.847400
18.849118
18.846318
18.836564
18.859785
18.839250
18.867247
18.832229
18.850751
18.836510
14.150863
14.149070
14.158910
14.137294
14.145802
14.145535
14.123902
14.153041
14.143547
14.163958
11.333145
11.327802
11.347258
11.317486
11.324436
11.331660
11.329350
11.344123
11.326964
11.328852
9.454940
9.452555
9.460143
9.450755
9.457250
9.471149
9.455060
9.441679
9.456859
9.443007
8.126341
8.123258
8.124685
8.122927
8.111444
8.120765
8.104056
8.126094
8.101228
8.112540
7.107636
7.115788
7.095445
7.113982
7.118149
7.094522
7.117909
7.113403
7.115782
7.119460
6.346616
6.338744
6.328375
6.338253
6.341830
6.331140
6.332462
6.351038
6.367343
6.352929
5.704962
5.683542
5.699549
5.716741
5.698619
5.688421
5.717077
5.686904
5.684000
5.720054
5.178512
5.192971
5.195547
5.196638
5.182815
5.181581
5.194582
5.203723
5.190749
5.199621
4.772698
4.761998
4.743285
4.746927
4.746411
4.758229
4.772117
4.767569
4.759577
4.753897
89.251694
89.348788
89.281708
89.278013
89.299754
89.443212
89.300965
89.374555
89.307755
89.342808
44.681847
44.709311
44.668623
44.659865
44.699392
44.686959
44.671320
44.708551
44.731599
44.694352
29.803137
29.806593
29.830610
29.825312
29.808391
29.823173
29.804717
29.798674
29.795157
29.834788
22.407027
22.405512
22.402830
22.397755
22.382443
22.428611
22.408854
22.381285
22.366110
22.377555
17.931164
17.924367
17.929957
17.954824
17.941486
17.960349
17.916997
17.964670
17.927473
17.946694
14.972433
14.927076
14.953387
14.971557
14.960740
14.954076
14.988446
14.998727
14.951473
15.000089
12.814569
12.844525
12.848671
12.863897
12.841083
12.828172
12.841054
12.840957
12.848143
12.884744
11.244623
11.213377
11.288210
11.257971
11.281887
11.274399
11.276169
11.246764
11.251625
11.248645
10.022535
10.055958
10.013683
10.062904
10.071990
10.065623
10.023297
10.066142
10.019828
10.060335
9.053777
9.048791
9.014580
9.054141
9.063900
9.013459
9.028682
9.026935
9.033721
9.027847
8.217634
8.204998
8.232874
8.205462
8.267276
8.267413
8.261343
8.242527
8.234680
8.217376
7.533035
7.556848
7.558419
7.557569
7.533890
7.565937
7.579489
7.546736
7.539902
7.552226

我也会发布之前的情节,以便衡量你在改善方面的帮助:

Original raw plot

1 个答案:

答案 0 :(得分:1)

我相信这会实现你想要的目标:

set xlabel "Number of threads"
set ylabel "Execution time"

set style fill solid 1.0 noborder

set boxwidth 0.7

set xtics ("1" 19.5)
set for[i=2:12] xtics add (sprintf("%d",i) (i-1)*55+19.5) 

set key top right

set xrange[-15:660]

plot for [i=0:2] for [j=0:9] 'test.dat' using ($0*55+j+i*15):1 every 30::(i*10+j) with boxes lt (i+1) t (j==0)?sprintf("Data Set %d",i+1):""

这里我们在两个边缘,线程之间插入15个单位,在数据集之间插入5个单位。我还将盒宽设置为绝对值而不是相对值。

结果如下:

enter image description here

解决你的观点:

第3点

是的,可以使用set for语法查看x-tics的设置。在这里,我明确指定第一个xtic。这具有关闭所有抽搐但是我指定的抽搐的效果,然后我使用set xtics add命令添加额外的xtics。如果我没有明确设置第一个,我会得到自动生成的抽动除了我的。

或者,我们可以在字符串中构建命令,然后使用

执行它
tcommand = "("
do for[i=1:12] {tcommand = sprintf("%s \"%d\" %f,",tcommand,i,(i-1)*55+19.5)}
tcommand = tcommand[1:strlen(tcommand)-1].")"
set xtics @tcommand

这里tcommand的内容将是

( "1" 19.500000, "2" 74.500000, "3" 129.500000, "4" 184.500000, "5" 239.500000, "6" 294.500000, "7" 349.500000, "8" 404.500000, "9" 459.500000, "10" 514.500000, "11" 569.500000, "12" 624.500000)

但是,这只适用于支持字符串宏的情况。

注意螺纹部分的宽度是3 * 10 + 2 * 5 + 15 = 55,因为有三个数据集占用10个空间,它们之间有5个空格的2个空格,以及15个空格的一个间隙。 19.5将tic标记直接放在中心数据集的中心。

第2点

这可以通过调整xrange轻松处理。如果我们将第一个框置于0,我们可以在-15处开始xrange以留下左边的间隙。由于有12个线程单元每个使用55个空格(包括间隙),我们可以将xrange的末尾放在660.

第1点

这是比较棘手的部分,我怀疑可能有更好的方法。特别是,数据结构使这更加困难。如果列出了数据集1的所有值,接着是集合2的所有值,依此类推,则会更容易。它们混合在一起的事实使它变得更难。

此处各种线程数和数据点的行号如下所示:

               Data set 1
     1 thread   2 threads   3 threads ...
1st  0          30          60
2nd  1          31          61
...

               Data set 2
     1 thread   2 threads   3 threads ...
1st  10         40          70
2nd  11         41          71
...

每个命令都不支持类似"每30个点开始连续10行",所以我们需要做两个循环。第一个循环(i)将在数据集上。第二个(j)将位于数据集中的第一行(第一行,第二行等)。

因此我们可以从(i * 10 + j)开始读取每30行。例如,当i和j都为0时,我们将读取第0行,第30行,第60行等,即数据集1的每个线程集中的第一行。因此,我们可以将这些值放在$ 0 * 55 + j + i * 15其中$ 0的范围是0到11,因此可以用来选择线程组。

因为这意味着我们每个数据集将有10条曲线,我们只在第一条曲线上设置标题(将其设置为空将其抑制)。

在这里,我使用了默认的线型。要为每个集合设置特定颜色,可以修改plot命令,或者可以重新定义线型。

编辑:

对于OP提供的排序数据集,plot命令(其余命令保持不变)可以简化为

plot for [i=0:2] 'test.dat' u (i*15 + floor($0/10)*55 + int($0)%10):1 every ::(i*120)::((i+1)*120-1) w boxes t sprintf("Data set %d",i+1)

这里我们只需循环遍历数据集。没有必要循环遍历线,因为我们可以读取连续行的一个块中的每个数据集。对于每个数据集,每个符号选择与其对应的120(行0 - 119,120 - 239,240 - 359)。

为了计算x坐标,我们计算数据集的偏移量(第一个为0,第二个为15,第三个为30),对应于前一个集合使用的10个单位块的数量加上间距为5个单位。为此我们添加了线程块的偏移量。为此,我们将行号(0索引)除以10(每个线程的测量次数)并将结果置于平局。因此前十行给出0,接下来的10行给我们1,依此类推。这告诉我们要跳过多少个线程块,然后将它乘以线程块的大小(55)。最后,我们在测量集中添加线的值。我们使用模运算来获得相对于线程块而不是数据集的实际行号(0,1,2,3,4,5,6,7,8,9,0,1,2 ...... )。因此i*15 + floor($0/10)*55 + int($0)%10为我们提供了测量的x坐标。尽管$ 0只有整数值,但它被视为浮点数,所以我们转换为int以获取模数。

添加标签要简单得多,因为我们只需要遍历每个数据集一次而不是10次,所以我们不必担心会跳过后来的循环。