直方图Matplotlib

所以我有一个小问题。 我有一个已经在直方图格式的scipy数据集,所以我有bin的中心和每个bin的事件数量。 我现在如何绘制直方图。 我只是试着做

bins, n=hist() 

但它不是那样的。 任何build议?

 import matplotlib.pyplot as plt import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) hist, bins = np.histogram(x, bins=50) width = 0.7 * (bins[1] - bins[0]) center = (bins[:-1] + bins[1:]) / 2 plt.bar(center, hist, align='center', width=width) plt.show() 

在这里输入图像描述

面向对象的接口也很简单:

 fig, ax = plt.subplots() ax.bar(center, hist, align='center', width=width) fig.savefig("1.png") 

如果您使用的是自定义(非常量) np.diff ,则可以使用np.diff传递计算宽度,将宽度传递给ax.bar并使用ax.set_xticks标记容器边缘:

 import matplotlib.pyplot as plt import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200] hist, bins = np.histogram(x, bins=bins) width = np.diff(bins) center = (bins[:-1] + bins[1:]) / 2 fig, ax = plt.subplots(figsize=(8,3)) ax.bar(center, hist, align='center', width=width) ax.set_xticks(bins) fig.savefig("/tmp/out.png") plt.show() 

在这里输入图像描述

如果你不想要酒吧,你可以这样绘制它:

 import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) bins, edges = np.histogram(x, 50, normed=1) left,right = edges[:-1],edges[1:] X = np.array([left,right]).T.flatten() Y = np.array([bins,bins]).T.flatten() plt.plot(X,Y) plt.show() 

直方图

如果你愿意/愿意使用pandas:

 pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar') 

我知道这不能回答你的问题,但是当我searchmatplotlib解决scheme到直方图时,我总是在这个页面上结束,因为简单的histogram_demo已经从matplotlib示例库页面中删除了。

这是一个解决scheme,不需要导入numpy 。 我只导入numpy来生成要绘制的数据x 。 它依赖于函数hist而不是@unutbu的回答中的functionbar

 import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) import matplotlib.pyplot as plt plt.hist(x, bins=50) plt.savefig('hist.png') 

在这里输入图像描述

另外检查一下matplotlib库和matplotlib的例子 。

我认为这可能对某人有用。

Numpy的直方图function,让我烦恼(虽然,我明白这是一个很好的理由),返回每个bin的边缘,而不是bin的值。 虽然这对浮点数是有意义的,这些浮点数可能位于一个区间内(即中心值不是超有意义的),但在处理离散值或整数(0,1,2等)时,这不是所需的输出, 。 特别是从np.histogram返回的bin的长度不等于count / density的长度。

为了解决这个问题,我使用了np.digitize来量化input,并返回离散数量的分箱,以及每个分箱的部分计数。 你可以很容易地编辑获得整数的计数。

 def compute_PMF(data) import numpy as np from collections import Counter _, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False) h = Counter(np.digitize(data,bins) - 1) weights = np.asarray(list(h.values())) weights = weights / weights.sum() values = np.asarray(list(h.keys())) return weights, values #### 

参考文献:

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

最好的方法是:

x.hist(y,20)

这是假定x是你想要做成直方图的任何数据的名称,y是你想要做的数据的列(在一个matrix中),20是你想要在你的直方图中的bin的数量。

我发现这个方法比其他的更容易和更短。 希望它有帮助!