如何创建具有不同bin宽度的直方图

时间:2014-03-25 20:20:28

标签: plot width gnuplot histogram bin

我使用hist plot未能成功。 一个简单的问题是使用以下数据:

age range - frequency - central band width -  bin width  - height (respectively)
1-4    - 30      -      2.5     -         3    -   10
5-6   -  20     -       5.5        -      1   -    20
7-17  -  30       -     12      -         10   -   3

随着沿X轴的年龄,具有线性刻度,因此1-4的箱宽度将为3,高度为10,箱子宽度为5-6将为1,高度为20,并且7-17将是10,高度是3。

如何将这些数据放入Word /记事本文档.dat文件中? 然后我如何使用它们在gnuplot中设置直方图?

2 个答案:

答案 0 :(得分:6)

我会使用以下数据文件格式(仅使用空格来分隔字段):

"age range" "frequency" "central band width" "bin width" "height"
1-4         30          2.5                  3           10
5-6         20          5.5                  1           20
7-17        30          12                   10          3
  • 要使用可变的boxwidth绘图,请使用boxes绘图样式。这允许您使用列中的值作为宽度。
  • 使用xtic(1),您可以将第一列中的条目用作xticlabel。

所以一个相当简单的绘图脚本如下所示:

set style fill solid noborder
set yrange [0:*]
set offset 1,1,1,0
plot 'file.txt' using 3:5:4:xtic(1) with boxes notitle

版本4.6.3和pngcairo终端的结果是:

enter image description here

答案 1 :(得分:0)

我昨晚管理了一个相当不错的可变宽度框示例。我正在绘制由FIO存储性能测试包产生的延迟直方图数据。使用我的编译选项,我有1856个箱子,如下所示:

  • 1 ns宽,0-128 ns(128 bins)
  • 2 ns宽,128-256 ns(64 bins)
  • 从256-512 ns(64 bins)
  • 4 ns宽
  • 从512-1024 ns(64 bins)

  • 8 ns宽
  • 等...

我在绘图时的延迟值以微秒为单位(FIO提供纳秒,但出于历史原因我想要微秒)。我没有机会在我的数据中包含bin宽度。所以我这样做了:

  • f(x)=(2 **(int(log(x * 1000)/ log(2)) - 6))/ 1100
  • plot" temp"你1:2:(f(第(1)列))带框fs透明实体0.7 noborder标题" $ legend" $ base_plot

f(x)定义返回给定延迟的框宽度 - 它的工作方式如下:

  1. 首先,x * 1000让我回到纳秒。
  2. log(x * 1000)/ log(2)取纳秒计数的基数2对数。
  3. int()只给出了整数部分。请注意,现在,例如,128 ns,我有7个。
  4. -6让我到了bin宽度的基数2日志。
  5. 2 **让我到了bin宽度。
  6. / 1000将我从纳秒返回到微秒。
  7. 然后我只在绘图命令中使用f(延迟)作为框宽。

    这是有效的 - 就我所知,它似乎完美无缺。它不会给出x< 64 ns,但我没有任何小的数据,所以它可以解决。可以使用条件表达式对该范围的那一部分进行修补。

    我认为这里的主要观察结果是:a)您不必将宽度作为文字数据 - 如果您可以根据您拥有的数据进行计算,那么您将获得金色,并且b) column(n)是$ n的替代,作为在plot命令中表示列值的一种方式。在我的情况下,我将所有这些都放在一个bash脚本中,而bash拦截了$ 1。