我在处理数值集时遇到问题,数据集的值范围从0到数万。使用hist()显示整个数据集的直方图是没有问题的。但是,如果我只想使用say x = [0,120]显示累积和标准的详细直方图,我必须使用600000个箱来确保细节。
棘手的问题是如果我只使用(0,120)的范围来显示标准和累积的hist,它将以1结束。但实际上它远远小于真正的'1',因为它只是在这个范围内小范围的数据。任何人都可以有一些想法如何利用matplotlib中的hist()来解决这个问题?我认为这不应该太复杂,我必须编写另一个函数来绘制我需要的文档。
答案 0 :(得分:1)
您可以将bins
设置为列表,而不是整数,例如bins=[1,2,3,..,120,30000,60000]
。
要回答下面的通讯,请参阅documentation:
的摘录仓:
整数个二进制位或给出二进制位的序列。如果bin是一个整数,将返回bin + 1 bin边缘,与numpy.histogram()的numpy版本> = 1.3一致,并且在早期版本中使用new = True参数。如果垃圾箱是一个序列,则支持不等间隔的垃圾箱。
和here is an example累积归一化直方图。注意bins = [100,125,150,160,170,180,190,200,210,220,230,240,250,275,300]
对此条形图的影响,前两个条形如何比中间条形宽。
答案 1 :(得分:1)
嗯,我想这与您之前的问题(Memory error when dealing with huge data)有关。我的建议似乎不适用于累积直方图。
我无法让plt.hist()与cyborg的建议相提并论,所以我手工制作了cumsum和normalization:
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()