【问题标题】:how to generate histogram from a bin?如何从 bin 生成直方图?
【发布时间】:2021-10-03 13:25:43
【问题描述】:

我有一些数据作为 numpy 数组 x, y, v,如下面的代码所示。

这实际上是 x-y 平面上尘埃粒子velocity (v) 的虚拟数据。

我已将我的数据分为 4 个 bin,对于每个 bin,我计算了每个 bin 中条目的平均值并制作了一张热图。

现在我要做的是在每个 bin 中制作v 的直方图/分布,以0 作为直方图的中心。

我不想再绘制平均值,只想将我的数据划分到与此代码相同的 bin 中,并且我想为每个 bin 生成 bin 中值的直方图。

我该怎么做?

我认为这是一种模拟气体粒子发射线光谱的方法。任何帮助表示赞赏!谢谢!

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

x = np.array([-10,-2,4,12,3,6,8,14,3])
y = np.array([5,5,-6,8,-20,10,2,2,8])
v = np.array([4,-6,-10,40,22,-14,20,8,-10])

x_bins = np.linspace(-20, 20, 3)
y_bins = np.linspace(-20, 20, 3)

H, xedges, yedges = np.histogram2d(x, y, bins = [x_bins, y_bins], weights = v)

pstat = stats.binned_statistic_2d(x, y, v, statistic='mean', bins = [x_bins, y_bins])

plt.xlabel("x")
plt.ylabel("y")
plt.imshow(pstat.statistic.T, origin='lower',  cmap='RdBu',
            extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])

plt.colorbar().set_label('mean', rotation=270)

编辑:请注意,我的原始数据非常庞大。我的 x、y、v 数组非常大,我使用的是 30x30 网格,也就是说,不仅仅是 4 个象限,而是 900 个箱。我可能还需要增加垃圾箱号。因此,我们希望找到一种方法,将“v”数据自动划分到规则间隔的 bin 中,然后能够绘制每个 bin 中“v”数据的直方图。

【问题讨论】:

    标签: python numpy histogram bin spectrum


    【解决方案1】:

    我会遍历压缩后的 x 和 y,然后标记 v 是否在象限内,并将它们附加到象限列表中。之后,您可以随意绘制:

    x = np.array([-10,-2,4,12,3,6,8,14,3])
    y = np.array([5,5,-6,8,-20,10,2,2,8])
    v = np.array([4,-6,-10,40,22,-14,20,8,-10])
    
    q1 = []
    q2 = []
    q3 = []
    q4 = []
    
    for i, (x1,y1) in enumerate(zip(x,y)):
        if x1<0 and y1>=0:
            q1.append(v[i])
        elif x1>=0 and y1>=0:
            q2.append(v[i])
        elif x1>=0 and y1<0:
            q3.append(v[i])
        elif x1<0 and y1<0:
            q4.append(v[i])
    print(q1)
    print(q2)
    print(q3)
    print(q4)  
    #[4, -6]
    #[40, -14, 20, 8, -10]
    #[-10, 22]
    #[]  
    plt.hist(q1, density=True)
    plt.hist(q2, density=True)
    plt.hist(q3, density=True)
    #q4 is empty
    

    【讨论】:

    • 嗨@barker,感谢您的回答,但实际上我的原始数据非常庞大。我的 x、y、v 数组非常大,我使用的是 30x30 网格,也就是说,不仅仅是 4 个象限,而是 900 个箱。我可能还需要增加垃圾箱号。那么,我们是否可以找到一种方法来概括代码,以便我们可以自动将数据分成规则间隔的 bin,然后能够绘制它们的直方图?
    • 嗯,听起来像是一个单独的问题。我会问一个新问题,如何快速将您的平面分成正方形,然后在每个正方形内组织您的数据点。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2014-09-21
    相关资源
    最近更新 更多