当前位置: 首页 > 知识库问答 >
问题:

Matplotlib:如何用等面积的面元制作直方图?

曹乐意
2023-03-14

给定一些遵循任意分布的数字列表,我如何为matplotlib.pyplot定义bin位置。hist(),以便每个箱子中的面积等于(或接近)某个恒定面积,A?应通过将箱子中的项目数乘以箱子的宽度来计算面积,其值应不大于A。

这是一个MWE,用于显示具有正态分布样本数据的直方图:

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randn(100)
plt.hist(x, bin_pos)
plt.show()

这里bin_pos是一个列表,表示垃圾箱边界的位置(参见此处的相关问题。

共有1个答案

孔君浩
2023-03-14

我发现这个问题很有趣。解决方案取决于你是要绘制一个密度函数,还是一个真正的直方图。后一种情况更具挑战性。这里有更多关于直方图和密度函数之间区别的信息。

这将实现密度函数所需的功能:

def histedges_equalN(x, nbin):
    npt = len(x)
    return np.interp(np.linspace(0, npt, nbin + 1),
                     np.arange(npt),
                     np.sort(x))

x = np.random.randn(1000)
n, bins, patches = plt.hist(x, histedges_equalN(x, 10), normed=True)

注意使用normed=True,它指定我们正在计算和绘制密度函数。在这种情况下,面积相等(可以查看n*np.diff(bins)进行检查)。还要注意,此解决方案涉及到查找具有相同点数的箱子。

以下解决方案为直方图提供了大致相等的面积框:

def histedges_equalA(x, nbin):
    pow = 0.5
    dx = np.diff(np.sort(x))
    tmp = np.cumsum(dx ** pow)
    tmp = np.pad(tmp, (1, 0), 'constant')
    return np.interp(np.linspace(0, tmp.max(), nbin + 1),
                     tmp,
                     np.sort(x))

n, bins, patches = plt.hist(x, histedges_equalA(x, nbin), normed=False)

然而,这些盒子并不都是相等的区域。尤其是第一个和最后一个,往往比其他的大大约30%。这是正态分布尾部数据稀疏分布的产物,我相信它会在数据集中人口稀疏的任何时候持续存在。

附带说明:我稍微使用了一下值pow,发现大约0.56的值对于正态分布的RMS误差较低。我坚持使用平方根,因为它在数据间隔紧密(相对于bin宽度)时表现最佳,而且我很确定它有一个理论基础,我没有费心去挖掘(有人吗?)。

据我所知,这个问题不可能得到确切的解决办法。这是因为它对数据的离散化敏感。例如,假设数据集中的第一个点是-13处的异常值,下一个值是-3,如图中的红点所示:

现在假设直方图的总“面积”是150,您需要10个箱子。在这种情况下,每个直方图条的面积应该约为15,但你无法达到这一点,因为一旦你的条包含第二个点,它的面积就会从10跳到20。也就是说,数据不允许这个条的面积在10到20之间。一个解决方案可能是调整方框的下限,以增加其面积,但是,如果这个“间隙”在数据集的中间,这就开始变得随意,并且不起作用。

 类似资料:
  • numpy.histogram()函数将输入数组和作为两个参数。 bin数组中的连续元素用作每个bin的边界。 Matplotlib 可以将直方图的数字表示转换为图形。 pyplot子模块的plt()函数将包含数据和数组的数组作为参数,并转换为直方图。

  • 我希望matplotlib直方图以等间距的xax显示数据,尽管它的bin的值不是等间距的。我该怎么做?目前,年龄组“0-6”、“7-12”、“13-16”、“17-20”的条形图看起来比我的其他数据更薄,“17-20”的条形图与21-30的条形图重叠。xtick标签也重叠。我如何解决这些问题?

  • NumPy有一个numpy.histogram()函数,它是数据频率分布的图形表示。 相等水平尺寸的矩形对应于称为bin类间隔和对应于频率的variable height 。 numpy.histogram() numpy.histogram()函数将输入数组和bin作为两个参数。 bin数组中的连续元素充当每个bin的边界。 import numpy as np a = np.array([2

  • 直方图(Histogram),又称质量分布图,它是一种条形图的一种,由一系列高度不等的纵向线段来表示数据分布的情况。 直方图的横轴表示数据类型,纵轴表示分布情况。 首先,我们需要了解柱状图和直方图的区别。直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。 例如,我们对某工厂的员工年龄做直方图统计,首先我们要统计出每一位员工的年龄,然后设定一个

  • 我有一张桌子,比如: 生成虚拟数据: 我想用垫线 (v1.4) 在 Python 3 中完成一个任务: 绘制的直方图 按 两个小时,未能获得所需的直方图 我阅读了matplotlib的示例和用户指南。令人惊讶的是,我没有找到关于如何从颜色图中指定颜色的教程 我在谷歌上搜索过,但没有找到一个简洁的例子 我想一个人可以用,不导入一系列模块,例如,

  • 有没有一种方法来绘制的CDF累积直方图的熊猫系列在Python中只使用海运?我有以下几点: 我知道我可以用绘制累积直方图,然后我知道我可以使用,但我想在Seaborn中实现这两个功能,就像用,提供kde拟合和直方图。有办法吗?