【问题标题】:gnuplot histogram bins divided by volumegnuplot 直方图箱除以体积
【发布时间】:2020-10-26 08:46:30
【问题描述】:

我正在模拟半径为 1 的球体体积中的点。我在该体积中生成了 1.000.000 个基于蒙特卡罗的点。为了制作 gnuplot 直方图,我计算了每个向量的长度(每个向量长度在 0 和 1 之间)。使用 100 个 bin,直方图如下所示: gnuplot data histogram.
如果有人想知道为什么没有生成大于 0.91 的点,我也不知道,但这不是这里的问题。

这是我的 gnuplot 代码:

n=100 #number of intervals
max=1.0 #max value
min=0.0 #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

#settings
set xlabel "Radius"
set ylabel "Primarys/Intervall"
set xrange [-0.1:1.1] 
set yrange [0:32000]
set boxwidth width*0.8
set style fill solid 0.5 #fillstyle
set tics out nomirror

#plot
plot "primaryPosition(1).csv" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green"

一般来说:体积增加 r^3 到半径 r。
在我的直方图中,每个球壳都是一个 bin,bin 编号是 100。因此,随着 bin 数量的增加,每个球壳的体积会呈立方增长(r^3)。从这个角度来看,直方图看起来不错。
但我想做的是绘制每体积点的密度:points/shellvolume。
这应该是从球体中心到其边界的线性分布。
我如何告诉 gnuplot 将每个 bin 除以其对应的体积,这取决于每个球壳的外半径和内半径?
公式为:(4/3)pi(R^3-r^3),R 外径,r 内径为壳。

【问题讨论】:

    标签: gnuplot histogram volume bin


    【解决方案1】:

    以下示例创建一些随机测试数据(应该是 20'000 个均匀分布的随机点)。 一种可能性是,您首先通过分箱创建直方图数据,然后将其除以外壳的体积。

    顺便说一句,球壳的体积是(4./3)*pi*(R**3-r**3),而不是你给出的公式。你为什么要设置max < min?也许您想根据您的确切需求微调分箱。

    代码:

    ### histogram normalized by sphere shell volume
    reset session
    set view equal xyz
    
    # create some test data
    set print $Data
        do for [i=1:20000] {
            x = rand(0)*2-1
            y = rand(0)*2-1
            z = rand(0)*2-1
            r = sqrt(x**2 + y**2 + z**2)
            if (r <= 1) { print sprintf("%g %g %g %g",x,y,z,r) }
        }
    set print
    
    n = 100                 # number of intervals
    min = 0.0               # max value
    max = 1.0               # min value
    myWidth=(max-min)/n     # interval width
    bin(x)=myWidth*floor(x/myWidth)
    
    ShellVolume(r) = (4./3)*pi*((r+myWidth)**3-r**3)
    set boxwidth myWidth absolute
    
    set table $Histo
        plot $Data u (bin($4)):(1) smooth freq
    unset table
    
    set multiplot layout 2,1
        plot $Histo u 1:2 w boxes ti "Occurrences"
    
        plot $Histo u 1:($2/ShellVolume($1)) w boxes ti "Density"
    unset multiplot
    ### end of code
    

    结果:

    【讨论】:

    • 我不小心交换了最小值和最大值,现在我将其更改为 max &gt; min。我希望hist(x,width)=width*floor(x/width)+width/2.0 正确定位每个条,例如bin 10 的条形图从 0.10 开始,到 0.11 结束。我认为您的 ShellVolume 有问题,因为它取决于 r 而不是 bin 编号。您正在为每个数据点计算一个新卷,还是我错了?我只需要 100 个 ShellVolume,每个 bin 一个卷。在对每个数据点进行分箱后,每个箱都必须除以其确定的体积。每个体积都必须用 bin 编号而不是 r 来计算。
    • 如果您输入print $Histo,它将显示数据。没有 bin 编号,但 bin 的下边界是第一列中外壳的较小半径。此 bin 中的出现或计数位于第二列。
    • print $Histo 不起作用:没有名为 $Histo 的数据块?
    • 如何开始你的脚本?运行脚本后,您应该在 gnuplot 控制台中加载它并在控制台中键入 print $Histo
    • 我正在使用 gnuplot 控制台加载像 gnuplot &gt; load 'data.csv' 这样的数据,然后我编写直方图的代码,就像我之前发布的那样,然后绘制它。就是这样,得到情节。我还尝试了命令print $Histoprint $dataprint $data.csv 但它没有用
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2017-08-25
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多