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

Python 在matplotlib直方图中设置相对频率,python,matplotlib,histogram,frequency,Python,Matplotlib,Histogram,Frequency,我将数据作为浮动列表,并将其绘制为直方图。函数的作用是绘制绝对直方图。然而,我不知道如何以相对频率的形式表示它——我希望它在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(

我将数据作为浮动列表,并将其绘制为直方图。函数的作用是绘制绝对直方图。然而,我不知道如何以相对频率的形式表示它——我希望它在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。它们似乎也依赖于箱子大小,好像它们没有被箱子大小或其他东西标准化。然而,当我将累计=1时,它很好地总结为1。那么,陷阱在哪里?顺便说一句,当我把同样的数据输入原点并绘制它时,它给出了完全正确的分数。谢谢大家!

因为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

或者您可以使用
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()

相对频率格式设置选项
density=True
。下图显示了从正态分布中采集的1000个样本的直方图,平均值为5,标准偏差为2.0

代码是

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轴上显示%s,可以使用
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()

为什么在引号中使用“列表”,您的数据和存储方式是否有特殊之处?您还调用了您的数据
data
,这很奇怪,因为Python命名约定规定
CamelCase
必须保留给类名—请参阅PEP 8。很抱歉造成误解。我只是不确定声明数据类型和参数等的约定。因此,我编辑了原始帖子,删除了所有引号。这只是整个代码的和平,为了简化,我重命名了变量,只是为了在这里发布它。在原始代码中,它们的名称较长,对我来说很有意义,但与问题无关,因为代码的其余部分工作得很好。我现在把它改名为mydata。不用担心,只是让你知道。为改进问题干杯,让它对每个人都更好。
normed
不推荐使用。您可以使用
密度
。它使积分(不是和)等于1。这就解决了问题。非常迅速的帮助。还有一个问题,如何将其表示为百分比而不是分数,即,如果没有默认参数,如何修改y轴值。再次非常感谢!如果您想要百分比,只需使用ax.hist(mydata,weights=np.zeros_like(data)+100./data.size)好了,现在我知道了权重的实际用途。再次感谢!我认为这是一样的:np.one_like(data)/data.sizeI很欣赏它,尽管我不得不使用len(data)为什么乘以
1.0
?答案是不对的。将密度设置为true意味着直方图上的积分为1,而不是所有的箱子加起来都是100%。