使用 matplotlib 归一化为 bin 高度

问题描述 投票:0回答:1

我有一组直方图,每个直方图都使用 pandas 数据框的单列和 matplotlib.pyplot.hist 函数。然而,每组数据的长度不同,所以我想对每个直方图进行归一化;使用内置密度选项对我的数据没有意义,因此我想将每个 bin 高度除以最大 bin 高度。

总的来说,我想知道如何 1- 从 plt.hist 制作的直方图中提取 bin 高度 2- 将所有 bin 高度除以最大值(这里被数据类型混淆,我想我正在尝试划分两个元组?) 3 - 使用标准化的 bin 高度绘制新的直方图。

理想情况下,我希望按照这样的顺序执行此操作:在原始图中调整我选择的 bin 编号,然后重新运行以更新原始图和归一化图。

我尝试命名 plt.hist 函数返回的内容,然后除以最大值,但是唯一没有抛出错误的版本给了我一个没有意义的图(我认为我将值分箱而不是bin 高度,我也不太明白 n、bin 和 patch 是什么)

(n, bins, patches) = plt.hist(df['values'], bins=50)

plt.hist(df['values']/max(n), bins 50) 
python matplotlib histogram normalization
1个回答
0
投票

plt.hist()
有3个返回值:

  • 每个条形的计数(这是默认显示的)
  • 条形之间的边(50 个条形有 51 个边)
  • 形成条形的图形元素(矩形块)

要再次使用返回值,您需要创建条形图,而不是直方图。新的直方图会将 50 个计数再次分类为新计数。

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
values = np.random.randn(10000).cumsum()
counts, bin_edges, _bars = plt.hist(values, bins=50)
plt.xlabel('Values')
plt.ylabel('Counts')
plt.show()

plt.hist()

plt.figure()
plt.bar(bin_edges[:-1], counts / counts.max(), width=np.diff(bin_edges), align='edge')
plt.xlabel('Values')
plt.ylabel('Percentage vs highest bar')
plt.show()

histogram normalized via highest bar

可以通过调用

np.histogram()
来跳过绘制原始直方图。除了图形元素之外,它具有相同的返回值:

© www.soinside.com 2019 - 2024. All rights reserved.