如何有效使用hist()显示累积和归一化直方图?

0 投票
2 回答
999 浏览
提问于 2025-04-17 05:22

我在处理一个数据集时遇到了问题,这个数据集的值范围从0到几万。用hist()函数显示整个数据集的直方图没有问题。但是,如果我只想显示一个范围在x = [0, 120]的累积和标准化的详细直方图,我就需要使用600000个区间(bins)来确保细节足够。

问题在于,如果我只用(0, 120)这个范围来显示标准化和累积的直方图,结果会是1。但实际上,这个结果远远小于真正的'1',因为它只是针对这个小范围的数据进行了标准化。有没有人能给我一些建议,如何在matplotlib中使用hist()函数来解决这个问题?我觉得这不应该这么复杂,我不想再写一个函数来绘制我需要的直方图。

2 个回答

1

嗯,我想这和你之前的问题有关(处理大数据时的内存错误)。我在那里的建议似乎对累积直方图不起作用。

我无法让plt.hist()和cyborg的建议配合得很好,所以我手动进行了累加和归一化:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

from numpy.random import normal

inp = np.abs(normal(0, 100000, 100000))

bins = range(0, 120)
a,b = np.histogram(inp, bins = bins)
bar_edges = b[:-1]
bar_width = b[1] - b[0]
bar_height = (np.cumsum(a) + sum(inp<min(bins))) / len(inp)
plt.figure(1)
plt.bar(bar_edges, bar_height, width = bar_width)
plt.show()
1

你可以把 bins 设置成一个列表,而不是一个整数,比如说 bins=[1,2,3,..,120,30000,60000]

为了回答你下面的评论,这里有一段来自 文档的摘录:

bins:

可以是一个整数,也可以是一个给定区间的序列。如果 bins 是一个整数,那么会返回 bins + 1 个边界,这和 numpy.histogram() 的返回结果是一致的,前提是 numpy 版本大于等于 1.3,早期版本中使用了 new = True 参数。如果 bins 是一个序列,那么也支持不等间距的区间。

还有 这是一个示例,展示了累积归一化的直方图。注意 bins = [100,125,150,160,170,180,190,200,210,220,230,240,250,275,300] 在这个条形图上的效果,前两个条形比中间的条形要宽。

enter image description here

撰写回答