numpy 分组和计数数据以归一化Y轴

9gm1akwq  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(191)

我有这个面积和直径数据:

DIAMETER    AREA
0   3.039085    1230000
1   2.763617    1230000
2   2.052176    1230000
3   9.498093    1230000
4   2.680360    1230000

我想按1(2- 3、3 -4等)对数据进行分组,并计算这些分组中的直径数量,以便按如下方式组织数据:

2-3  3-4  4-5  5-6  6-7  7-8  8-9  9-10
3     1    0    0    0    0    0    1

我的最终目标是获取这些计数,并将它们除以面积,以便归一化计数。最后,我将绘制归一化计数(y)乘以bin(x)。
我尝试使用PD.cut方法,但不起作用

ygya80vv

ygya80vv1#

要做到这一点,你需要一个histogram,这可以很容易地通过你的panda DataFramehist方法来实现(这个方法本身,只需要使用Matplotlib的hist绘图方法,它使用NumPy的histogram函数),例如:

import pandas as pd
from matplotlib import pyplot as plt

# create a version of the data for the example
data = pd.DataFrame({"DIAMETER": [3.039085, 2.763617, 2.052176, 9.498093, 2.680360]})

fig, ax = plt.subplots()  # create a figure to plot onto

bins = [2, 3, 4, 5, 6, 7, 8, 9, 10]  # set the histogram bin edges
data.hist(
    column="DIAMETER",  # the column to histogram
    bins=bins,  # set the bin edges
    density=True,   # this normalises the histogram  
    ax=ax,  # the Matplotlib axis onto which to plot
)

fig.show()  # show the plot

这给出:

其中Pandas hist函数将根据列名自动添加图标题。
如果您不指定bins关键字,那么它将自动生成10个以数据范围为边界的区间,但这些区间不一定是整数间隔的。如果您想确保任意数据都是整数间隔的区间,那么您可以使用以下命令设置区间:

import numpy as np

bins = np.arange(
    np.floor(data["DIAMETER"].min()),
    np.ceil(data["DIAMETER"].max()) + 1,
)

如果你想要一个像other post中建议的那样的图,那么纯粹使用NumPy和Matplotlib你可以:

import numpy as np
from matplotlib import pyplot as plt

# set bins
bins = np.arange(
    np.floor(data["DIAMETER"].min()) - 1,  # subtract 1, so we have a zero count bin at the start
    np.ceil(data["DIAMETER"].max()) + 2,  # add 2, so we have a zero count bin at the end
)

# generate histogram
counts, _ = np.histogram(
    data["DIAMETER"],
    bins=bins,
    density=True,  # normalise histogram
)

dx_2 = 0.5 * (bins[1] - bins[0])  # bin half spacing (we know this is 1/2, but lets calculate it in case you change it!)

# plot
fig, ax = plt.subplots()
ax.plot(
    bins[:-1] + dx_2,
    counts,
    marker="s",  # square marker like the plot from your other question
)

ax.set_xlabel("Diameter")
ax.set_ylabel("Probability density")

fig.show()

其给出:

相关问题