2

我有一个看起来像的文件

$cat myfile.dat

1 8 32 19230 1.186 3.985
1 8 64 9620 0.600 7.877
1 8 128 4810 0.312 15.136
1 8 256 2410 0.226 20.927
1 8 512 1210 0.172 27.708
1 8 1024 610 0.135 35.582
1 8 2048 310 0.121 40.172
1 8 4096 160 0.117 43.141
1 8 8192 80 0.112 44.770
.....
2 8 16384 300 0.692 6.816
2 8 32768 150 0.686 6.877
2 8 65536 80 0.853 5.904
2 10 320 7830 1.041 4.575
2 10 640 3920 0.919 5.189
2 10 1280 1960 0.828 5.757
2 10 2560 980 0.773 6.167
2 10 5120 490 0.746 6.391
2 10 10240 250 0.748 6.507
2 10 20480 130 0.770 6.567
....
3 18 8192 10 1.311 12.759
3 20 32 650 1.631 3.978
3 20 64 330 0.838 7.863
3 20 128 170 0.483 14.046
3 20 256 90 0.508 14.160
3 20 512 50 0.559 14.283
3 20 1024 30 0.665 14.405
3 20 2048 20 0.865 14.782
3 20 4096 10 0.856 14.932
3 20 8192 10 1.704 14.998

如您所见,根据我们想要作为x轴的列,有多种方法可以绘制此信息。我想绘制信息的方法之一是第 6 列与第 1 列

p "myfile.dat" u 1:6

在此处输入图像描述

我的主要问题是是否有办法将这些条形图绘制为实心框,因为我们只对达到的峰值感兴趣,而不对点的频率或密度区域感兴趣。

4

2 回答 2

2

Gnuplot 有一个smooth选项,它可以用于例如对相同的值smooth frequency求和所有的值。不幸的是,这里没有您需要的 ,但是可以通过在语句中的一些技巧来“模仿”它。yxsmooth maximumUsing

reset
xval = -1000
max(x, y) = (x > y ? x : y)
maxval = 0
colnum = 6

set boxwidth 0.2

plot 'mydata.dat' using (val = column(colnum), $1):\
     (maxval_prev = (xval == $1 ? maxval : 0), \
      maxval = (xval == $1 ? max(maxval, val) : val),\
      xval = $1, \
      (maxval > maxval_prev ? maxval-maxval_prev : 0)\
     ) \
     smooth frequency lw 3 with boxes t 'maximum values'

每个using条目都可以包含不同的分配,这些分配用逗号分隔。

如果出现新x值,则初始化变量。这是可行的,因为数据是由 单调xsmooth frequency

如果当前值大于存储的最大值,则将存储的最大值与当前值的差值相加。由于重复加减,这可能会导致数值错误,但根据您的样本数据和绘图的分辨率,这应该不是问题。

您的数据的结果是: 在此处输入图像描述

于 2013-08-14T18:51:34.033 回答
1

您可以搜索最大值并仅绘制它,但这可能更容易,即使它在另一个上绘制了很多框:

plot "myfile.dat" using 1:6:(.1) with boxes fillstyle solid
于 2013-08-14T13:40:58.383 回答