gnuplot直方图存储箱除以体积

gnuplot直方图存储箱除以体积,gnuplot,histogram,volume,bin,Gnuplot,Histogram,Volume,Bin,我正在模拟半径为1的球体体积中的点。我在本卷中生成了1.000.000个基于蒙特卡罗的点。为了制作gnuplot直方图,我计算了每个向量的长度(每个向量的长度在0和1之间)。对于100个箱子,直方图如下所示: . 如果有人想知道为什么没有大于0.91的点产生,我也不知道,但这不是这里的问题 这是我的gnuplot代码: n=100 #number of intervals max=1.0 #max value min=0.0 #min value width=(max-min)/n #inter

我正在模拟半径为1的球体体积中的点。我在本卷中生成了1.000.000个基于蒙特卡罗的点。为了制作gnuplot直方图,我计算了每个向量的长度(每个向量的长度在0和1之间)。对于100个箱子,直方图如下所示: .
如果有人想知道为什么没有大于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。
在我的历史程序中,每个球壳是一个箱子,箱子编号是100。因此,随着箱子数量的增加,每个特殊外壳的体积呈立方增长(r^3)。从这个角度来看,直方图看起来不错。
但我想做的是绘制每个体积的点密度:点/壳体积。
这应该是从球体中心到其边界的线性分布。
如何让gnuplot根据每个球壳的外径和内径,将每个箱子除以相应的体积
公式为:(4/3)π(R^3-R^3),外壳的外半径为R,内半径为R。

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

顺便说一下,球壳的体积是
(4./3)*pi*(R**3-R**3)
,而不是你给出的公式。为什么要设置
max
?也许你想根据你的具体需要对装箱进行微调

代码:

### 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
球壳体积归一化的直方图 重置会话 将视图设置为相等xyz #创建一些测试数据 设置打印$Data do for[i=1:20000]{ x=兰特(0)*2-1 y=兰特(0)*2-1 z=兰特(0)*2-1 r=sqrt(x**2+y**2+z**2)
如果(r)我意外地交换了最小值和最大值,现在我将其更改为
max>min
。我更喜欢
hist(x,width)=width*floor(x/width)+width/2.0
正确定位每个条,例如,存储箱10的条从0.10开始,到0.11结束。我认为您的ShellVolume有问题,因为它取决于r而不是存储箱编号。您正在为每个数据点计算一个新卷,还是我错了?我只需要100个ShellVolume,每个存储箱一个卷。每次da之后tapoint为binned每个bin必须除以其确定的体积。每个体积必须使用bin编号而不是r进行计算。如果键入
print$Histo
,它将显示数据。没有bin编号,只有bin的下边框,即第一列中壳的较小半径。此b中的出现或计数in位于第二列。
print$Histo
不起作用:没有名为$Histo的数据块?如何启动脚本?您应该在gnuplot控制台中加载它,并在运行脚本后在控制台中键入
print$Histo
。我正在使用gnuplot控制台加载数据,如
gnuplot>load'data.csv'
>然后,我在之前发布直方图时,为直方图编写代码,然后进行绘图。就是这样,然后获取绘图。我还尝试了命令
print$Histo
print$data
print$data.csv
,但没有成功