直方图 Matplotlib

所以我有个小问题。我有一个已经在柱状图格式的数据集,所以我有中心的垃圾箱和每个垃圾箱的事件数量。我现在怎么绘图是作为一个直方图。我只是试着去做

bins, n=hist()

but it didn't like that. Any recommendations?

181535 次浏览
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()

enter image description here

面向对象的界面也很简单:

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

如果你不想要酒吧,你可以这样设计:

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

如果你愿意使用 pandas:

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

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

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

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 画廊Matplotlib 示例

这个可能对某人有用。

NumPy的直方图函数返回每个柱形的边缘,而不是柱形的值。这对于浮点数是有意义的,它可以位于一个区间内,但在处理离散值或整数(0、1、2等)时可能不是所需的结果。特别地,从NP.histogram返回的bin的长度不等于计数/密度的长度。

为了解决这个问题,我使用 np.digitize 对输入进行量化,并计算每个 bin 的计数分数。您可以很容易地编辑以获得计数的整数数目。

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

Https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

我刚刚意识到,hist文档明确地说明了当您已经有 np.histogram时应该做什么

counts, bins = np.histogram(data)
plt.hist(bins[:-1], bins, weights=counts)

这里重要的一点是,你的计数只是简单的 举重。如果这样做,就不再需要 bar 函数了

从 matplotlib 3.4.0开始

新的强 > plt.stairs(或 ax.stairs )直接与np.histogram一起工作:

  • np.histogram返回计数和边缘
  • plt.stairs 接受计数和边缘

例如,给出 unutbu 的样本 x = 100 + 15 * np.random.randn(10000):

counts, edges = np.histogram(x, bins=50)
plt.stairs(counts, edges, fill=True)
plt.stairs with np.histogram

或者,将 np.histogram直接解压到 plt.stairs :

plt.stairs(*np.histogram(x, bins=50), fill=True)

有关如何使用楼梯打印的更多示例,请参阅官方的matplotlib图库。