如何有效使用hist()显示累积和归一化直方图?
我在处理一个数据集时遇到了问题,这个数据集的值范围从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]
在这个条形图上的效果,前两个条形比中间的条形要宽。
