直方图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的数量。
我发现这个方法比其他的更容易和更短。 希望它有帮助!