<p>使用<code>plt.hist</code>没有简单的方法(据我所知)做到这一点。但是您可以简单地使用<code>np.histogram</code>对数据进行存储,然后以任何方式规范化数据。如果我理解正确,你希望数据显示在给定的箱子里找到一个点的概率,而不是概率分布。这意味着你必须缩放你的数据,所有箱子的总和是1。这可以通过做<code>bin_probability = n/float(n.sum())</code>来实现。在</p>
<p>你将不再有一个适当规范化的概率分布函数(pdf),这意味着在区间上的积分将不再是一个概率!这就是为什么你必须重新缩放你的<code>mlab.normpdf</code>以获得与直方图相同的标准。所需的系数仅为bin宽度,因为当您从正确规范化的binned pdf开始时,所有bin的总和乘以它们各自的宽度为1。现在你想要的是箱数之和等于1。所以比例因子就是箱子的宽度。在</p>
<p>因此,您最终得到的代码大致如下:</p>
<pre><code>import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
# Produce test data
S = np.random.normal(0, 0.01, size=1000)
# Histogram:
# Bin it
n, bin_edges = np.histogram(S, 100)
# Normalize it, so that every bins value gives the probability of that bin
bin_probability = n/float(n.sum())
# Get the mid points of every bin
bin_middles = (bin_edges[1:]+bin_edges[:-1])/2.
# Compute the bin-width
bin_width = bin_edges[1]-bin_edges[0]
# Plot the histogram as a bar plot
plt.bar(bin_middles, bin_probability, width=bin_width)
# Fit to normal distribution
(mu, sigma) = stats.norm.fit(S)
# The pdf should not normed anymore but scaled the same way as the data
y = mlab.normpdf(bin_middles, mu, sigma)*bin_width
l = plt.plot(bin_middles, y, 'r', linewidth=2)
plt.grid(True)
plt.xlim(-0.05,0.05)
plt.show()
</code></pre>
<p>结果是:</p>
<p><a href="https://i.stack.imgur.com/hMlZc.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/hMlZc.png" alt="enter image description here"/></a></p>