【问题标题】:Polishing gnuplot histogram plot抛光 gnuplot 直方图
【发布时间】:2016-04-05 21:27:50
【问题描述】:

我正在尝试使用 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 个单位。
  • 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

我还发布了该情节之前的样子,以便您衡量您在改进方面的帮助:

【问题讨论】:

  • 我扩展了我的答案,为已排序的数据集提供了一个绘图命令,这样它就完整并涵盖了您提供的数据集的两种形式。请注意,对于已排序的数据集,every 的选择更简单,只有一个 for(因为我们不必处理交织),并且标题规范更简单。 x 坐标计算变得稍微复杂一些,但总的来说它是一个更简单的命令。

标签: gnuplot histogram


【解决方案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 个单元。我还将 boxwidth 设置为绝对而不是相对。

结果如下:

解决你的观点:

第 3 点

是的,可以使用set for 语法查看x-tics 的设置。在这里,我明确指定了第一个 xtic。这具有关闭除我指定的之外的所有 tic 的效果,然后我使用 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 个空格,它们之间有 2 个空格,5 个空格,1 个间隔 15 个空格。 19.5 将tic mark 直接放在中心数据集的中心。

第 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
...

every 命令不支持“每 30 个点开始 10 个连续行”,因此我们需要执行两个循环。第一个循环 (i) 将遍历数据集。第二个 (j) 将超过数据集中的行(第一行、第二行等)。

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

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

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

编辑:

对于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)

这里我们只需要遍历数据集。无需遍历行,因为我们可以在一个连续行块中读取每个数据集。对于每个数据集,every 符号选择与其对应的 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 次,因此我们不必担心跳过后面的循环。

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 2017-08-25
    • 2016-05-27
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-10-07
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多