我试图制作圆形散射粒子的径向分布的直方图,并且我试图缩放直方图,以便径向分布是每单位面积的粒子。
免责声明:如果您不关心我所谈论的数学,请跳过此部分:
我将径向分布分成相等宽度的环,从中心出来。所以,在中心,我将有一个半径的圆,a。这个最内部分的区域将是$ \ pi a ^ {2} $。
现在,如果我们想知道从径向距离a到2a的环面区域,我们做$$ \ int_ {a} ^ {2a} 2 \ pi r \ dr = 3 \ pi a ^ {2} $$
继续以类似的方式(从2a到3a,3a到4a等),我们看到区域增加如下:$$ Areas = \ pi a ^ {2},3 \ pi a ^ {2 },5 \ pi a ^ {2},7 \ pi a ^ {2},... $$
因此,当我对散射的径向分布的直方图进行加权时,从中心出来,每个bin都必须加权,以便第一个bin的计数保持不变,第二个bin的计数被分割3,第三个bin的计数除以5等等。
所以:这是我对代码的尝试:
import numpy as np
import matplotlib.pyplot as plt
# making random sample of 100000 points between -2.5 and 2.5
y_vec = 5*np.random.random(100000) - 2.5
z_vec = 5*np.random.random(100000) - 2.5
# blank canvasses for the y, z, and radial arrays
y_vec2 = []
z_vec2 = []
R_vec = []
# number of bins I want in the ending histogram
bns = 40
# cutting out the random samplings that aren't in a circular distribution
# and making the radial array
for i in range(0, 100000):
if np.sqrt((y_vec[i]*y_vec[i] + z_vec[i]*z_vec[i])) <= 2.5:
y_vec2.append(y_vec[i])
z_vec2.append(z_vec[i])
R_vec.append(np.sqrt(y_vec[i]*y_vec[i] + z_vec[i]*z_vec[i]))
# setting up the figures and plots
fig, ax = plt.subplots()
fig2, hst = plt.subplots()
# creating a weighting array for the histogram
wghts = []
i = 0
c = 1
# making the weighting array so that each of the bins will be weighted correctly
# (splitting the radial array up evenly in to groups of the size the bins will be
# and weighting them appropriately). I assumed the because the documentation says
# the "weights" array has to be the same size as the "x" initial input, that the
# weights act on each point individually...
while i < bns:
wghts.extend((1/c)*np.ones(len(R_vec)/bns))
c = c + 2
i = i + 1
# Making the plots
ax.scatter(y_vec2, z_vec2)
hst.hist(R_vec, bins = bns, weights = wghts)
# plotting
plt.show()
散点图看起来很棒:
但是,径向情节表明我的加权错误。它应该在所有环形中保持不变,但它正在增加,好像它根本没有加权:
径向分布的不规则外观向我暗示了&#34; hist&#34;中的加权函数。运算符单独对R_vec的每个成员进行加权,而不是对加权进行加权。
我如何按照我需要缩放它们的因素对箱子进行加权?有什么帮助吗?
答案 0 :(得分:0)
当你猜测权重对单个值而不是箱子进行加权时,你是正确的。这是documented:
x中的每个值仅将其相关权重贡献给bin计数(而不是1)。
因此,基本问题是,在计算权重时,您不会考虑点的顺序。您随机创建了点,但随后从最大到最小创建了权重。这意味着您没有为正确的点分配正确的权重。
您应该创建权重的方法是直接从其半径计算每个点的权重。您似乎想要这样做的方法是将半径离散化为分箱半径,然后相反地加权。而不是你为权重做什么,试试这个:
R_vec = np.array(R_vec)
wghts = 1 / (2*(R_vec//(2.5/bns))+1)
这给了我正确的结果:
你也可以得到基本相同的结果,而无需在加权中进行分箱 - 也就是说,只需用每个点的半径直接加权:
R_vec = np.array(R_vec)
wghts = 1 / R_vec
这样做的好处是,您可以在不重新计算权重的情况下将直方图绘制到不同数量的箱子中。从连续意义上的每个点到多远来衡量每个点的重要性,而不是它是落在一个侧面还是另一个离散的边界边界上。
答案 1 :(得分:0)
如果要绘制“每单位面积”的内容,请使用区域作为自变量。 这样,您仍然可以使用直方图,但您不必担心非均匀分级或加权。
我替换了你的行:
hst.hist(R_vec, bins = bns, weights = wghts)
使用:
hst.hist(np.pi*np.square(R_vec),bins=bns)