直方图Matplotlib

问题描述 投票:99回答:5

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

bins, n=hist()

但它不喜欢那样。有什么建议?

python numpy matplotlib scipy
5个回答
222
投票
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传递计算宽度,将宽度传递给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()

enter image description here


20
投票

如果您不想要酒吧,可以像这样绘制:

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()

histogram


11
投票

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

这是一个解决方案,不需要导入numpy。我只导入numpy来生成要绘制的数据x。它依赖于函数hist而不是函数bar,就像在@unutbu的answer中一样。

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')

enter image description here

还可以看看matplotlib gallerymatplotlib examples


6
投票

如果你愿意使用pandas

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

0
投票

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

Numpy的直方图函数,令我烦恼(虽然,我很欣赏它有一个很好的理由),返回每个bin的边缘,而不是bin的值。虽然这对浮点数有意义,浮点数可以位于一个区间内(即中心值不是超级有意义),但这不是处理离散值或整数(0,1,2等)时所需的输出。特别是,从np.histogram返回的箱的长度不等于计数/密度的长度。

为了解决这个问题,我使用np.digitize来量化输入,并返回离散数量的二进制数,以及每个二进制数的一部分计数。您可以轻松编辑以获取整数计数。

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

© www.soinside.com 2019 - 2024. All rights reserved.