在matplotlib直方图中设置相对频率

时间:2012-03-19 08:52:55

标签: python matplotlib histogram frequency

我有数据作为浮动列表,我想将其绘制为直方图。 Hist()函数完美地完成了绘制绝对直方图的工作。但是,我无法弄清楚如何以相对频率格式表示它 - 我希望将其作为一个分数或理想情况下作为y轴上的百分比。

以下是代码:

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, patches = ax.hist(mydata, bins=100, normed=1, cumulative=0)
ax.set_xlabel('Bins', size=20)
ax.set_ylabel('Frequency', size=20)
ax.legend

plt.show()

我认为normed = 1参数会这样做,但它会给出分数太高而有时大于1.它们似乎也依赖于bin大小,就好像它们没有通过bin大小或其他东西标准化。然而,当我设置cumulative = 1时,很好地总结为1.那么,捕获的位置在哪里?顺便说一下,当我将相同的数据输入Origin并绘制它时,它给出了完全正确的分数。谢谢!

3 个答案:

答案 0 :(得分:33)

因为hist的normed选项返回点的密度,例如dN / dx

你需要的是这样的东西:

 # assuming that mydata is an numpy array
 ax.hist(mydata, weights=np.zeros_like(data) + 1. / data.size)
 # this will give you fractions

答案 1 :(得分:4)

或者您可以使用set_major_formatter来调整y轴的比例,如下所示:

from matplotlib import ticker as tick

def adjust_y_axis(x, pos):
    return x / (len(mydata) * 1.0)

ax.yaxis.set_major_formatter(tick.FuncFormatter(adjust_y_axis))

只需在adjust_y_axis之前调用plt.show()

答案 2 :(得分:1)

对于相对频率格式,设置选项 density=True。下图显示了取自均值为 5 且标准差为 2.0 的正态分布的 1000 个样本的直方图。

Histogram generated with matplotlib

代码是

import numpy as np
import matplotlib.pyplot as plt

# Generate data from normal distibution
mu, sigma = 5, 2.0 # mean and standard deviation
mydata = np.random.normal(mu, sigma, 1000)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(mydata,bins=100,density=True);
plt.show()

如果您想在 y 轴上使用 %,您可以使用 PercentFormatter,如下所示

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter

# Generate data from normal distibution
mu, sigma = 5, 2.0 # mean and standard deviation
mydata = np.random.normal(mu, sigma, 1000)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(mydata,bins=100,density=False);
ax.yaxis.set_major_formatter(PercentFormatter(xmax=100))
plt.show()

enter image description here