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

use*_*140 24 python frequency matplotlib histogram

我有数据作为浮动列表,我想将其绘制为直方图.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()
Run Code Online (Sandbox Code Playgroud)

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

seg*_*sai 34

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

你需要的是这样的:

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

  • 我认为这是一样的:np.ones_like(data)/ data.size (8认同)
  • 如果你想要百分比,只需使用ax.hist(mydata,weights = np.zeros_like(data)+ 100./data.size) (4认同)

fra*_*xel 5

或者可以使用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))
Run Code Online (Sandbox Code Playgroud)

只需adjust_y_axis按上述方式调用即可plt.show()