如果我的 .dat 文件已经有正确分箱的数据,我知道如何在 gnuplot 中创建直方图(只需使用“带框”)。有没有办法获取数字列表并让 gnuplot 根据用户提供的范围和 bin 大小提供直方图?

有帮助吗?

解决方案

是的,它的快速和简单的,虽然很隐蔽:

binwidth=5
bin(x,width)=width*floor(x/width)

plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

签出help smooth freq看到为什么上面使得直方图

,处理范围只设置x范围可变。

其他提示

我对 Born2Smile 非常有用的答案做了一些更正/补充:

  1. 空的垃圾箱导致相邻垃圾箱的盒子错误地延伸到其空间中;避免这种情况使用 set boxwidth binwidth
  2. 在 Born2Smile 的版本中,箱被渲染为以其下界为中心。严格来说,它们应该从下限延伸到上限。这可以通过修改来纠正 bin 功能: bin(x,width)=width*floor(x/width) + width/2.0

要特别小心:此页面上的所有答案都隐含地决定了分箱开始的位置 - 最左边分箱的左边缘,如果您愿意 - 从用户手中决定。如果用户将这些用于对数据进行分箱的函数中的任何一个与他/她自己关于分箱开始位置的决定相结合(如上面链接的博客上所做的那样),则上述函数都是不正确的。对于对“Min”进行装箱的任意起点,正确的函数是:

bin(x) = width*(floor((x-Min)/width)+0.5) + Min

您可以看到为什么这按顺序是正确的(它有助于绘制几个垃圾箱并在其中一个垃圾箱中的某个位置绘制一个点)。从数据点中减去 Min,即可查看它距离分箱范围有多远。然后除以 binwidth,以便您有效地以“bin”为单位进行工作。然后将结果“向下”移动到该 bin 的左边缘,添加 0.5 到 bin 的中间,乘以宽度,这样您就不再以 bin 为单位,而是以绝对比例进行工作再次,然后最后加上您在开始时减去的最小偏移量。

考虑一下这个函数的实际应用:

Min = 0.25 # where binning starts
Max = 2.25 # where binning ends
n = 2 # the number of bins
width = (Max-Min)/n # binwidth; evaluates to 1.0
bin(x) = width*(floor((x-Min)/width)+0.5) + Min

例如值 1.1 真正落入左侧箱中:

  • 该函数正确地将其映射到左箱的中心(0.75);
  • Born2Smile 的答案 bin(x)=width*floor(x/width) 错误地将其映射为 1;
  • mas90 的答案 bin(x)=width*floor(x/width) + binwidth/2.0,错误地将其映射到 1.5。

仅当 bin 边界出现在 (n+0.5)*binwidth (其中 n 为整数)时,Born2Smile 的答案才是正确的。仅当 bin 边界出现在 n*binwidth 时,mas90 的答案才是正确的。

你要绘制这样一个图? “在这里输入的图像描述” 是?然后,你可以看看我的博客文章: HTTP: //gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html

从代码密钥行:

n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style

#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle

像往常一样,gnuplot的是绘制甜蜜看图表,它可以使执行各种计算的一个极好的工具。的然而下,其旨在绘制数据而不是作为一个计算器,它往往容易使用外部程序(例如八度)做更“复杂”的计算,保存在这个数据文件,然后使用的Gnuplot来产生曲线图。对于上述问题,检查出的“历史”功能被倍频使用[freq,bins]=hist(data),然后使用这个绘制在gnuplot的

set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes

我发现这个讨论非常有用的,但我已经经历了一些“四舍五入”的问题。

更精确地,使用0.05的binwidth,我注意到,对于上述这里提出的技术,其内容在0.1和0.15下降相同的箱柜的数据点。此(显然不希望的行为)是最可能是由于在“地板”函数。

下面是我小的贡献,试图绕开这一点。

bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes

此递归方法是对于x> = 0;一个可以与多个条件语句概括此获得甚至更一般的东西。

我们并不需要使用递归方法,它可能会很慢。我的解决方案是使用禀函数int或地板的用户定义的函数RINT instesd。

rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)

此函数将给rint(0.0003/0.0001)=3,而int(0.0003/0.0001)=floor(0.0003/0.0001)=2

为什么呢?请看 Perl的Int函数和填零

我有一个小的修改Born2Smile的溶液。

我知道,没有多大意义,但你可能要以防万一。如果你的数据是整数,你需要一个浮动窗口尺寸(可能与另一组数据,或者在更精细的网格划分密度比较),则需要在0和1之间添加内部地板的随机数。否则,就会出现由于四舍五入误差尖峰。 floor(x/width+0.5)不会做,因为它会创建模式,这不是真实的原始数据。

binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))

对于分级功能,没想到至今所提供的功能的结果。即,如果我的binwidth是0.001,这些功能被集中于0.0005分仓,而我觉得这是更直观的具有集中在0.001边界仓。

在换句话说,我想有

Bin 0.001 contain data from 0.0005 to 0.0014
Bin 0.002 contain data from 0.0015 to 0.0024
...

我想出的装箱函数是

my_bin(x,width)     = width*(floor(x/width+0.5))

下面是一个脚本,一些提供斌功能比较这一个:

rint(x) = (x-int(x)>0.9999)?int(x)+1:int(x)
bin(x,width)        = width*rint(x/width) + width/2.0
binc(x,width)       = width*(int(x/width)+0.5)
mitar_bin(x,width)  = width*floor(x/width) + width/2.0
my_bin(x,width)     = width*(floor(x/width+0.5))

binwidth = 0.001

data_list = "-0.1386 -0.1383 -0.1375 -0.0015 -0.0005 0.0005 0.0015 0.1375 0.1383 0.1386"

my_line = sprintf("%7s  %7s  %7s  %7s  %7s","data","bin()","binc()","mitar()","my_bin()")
print my_line
do for [i in data_list] {
    iN = i + 0
    my_line = sprintf("%+.4f  %+.4f  %+.4f  %+.4f  %+.4f",iN,bin(iN,binwidth),binc(iN,binwidth),mitar_bin(iN,binwidth),my_bin(iN,binwidth))
    print my_line
}

和这里的输出

   data    bin()   binc()  mitar()  my_bin()
-0.1386  -0.1375  -0.1375  -0.1385  -0.1390
-0.1383  -0.1375  -0.1375  -0.1385  -0.1380
-0.1375  -0.1365  -0.1365  -0.1375  -0.1380
-0.0015  -0.0005  -0.0005  -0.0015  -0.0010
-0.0005  +0.0005  +0.0005  -0.0005  +0.0000
+0.0005  +0.0005  +0.0005  +0.0005  +0.0010
+0.0015  +0.0015  +0.0015  +0.0015  +0.0020
+0.1375  +0.1375  +0.1375  +0.1375  +0.1380
+0.1383  +0.1385  +0.1385  +0.1385  +0.1380
+0.1386  +0.1385  +0.1385  +0.1385  +0.1390
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top