我有数据作为浮动列表,我想将其绘制为直方图。 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并绘制它时,它给出了完全正确的分数。谢谢!
答案 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 个样本的直方图。
代码是
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()