我正在尝试绘制规范直方图,但不是在y轴上得到1作为最大值,而是得到不同的数字。
对于数组k =(1,4,3,1)
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(1,4,3,1)
plt.hist(k, normed=1)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
我得到这个直方图,看起来不像诺曼。
对于不同的数组k =(3,3,3,3)
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(3,3,3,3)
plt.hist(k, normed=1)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
我得到这个直方图,最大y值是10.
对于不同的k,即使normed = 1或normed = True,我也得到不同的y最大值。
为什么规范化(如果有效)会根据数据发生变化,如何使y的最大值等于1?
更新
我正在尝试从Carsten König实施plotting histograms whose bar heights sum to 1 in matplotlib回答并得到非常奇怪的结果:
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(1,4,3,1)
weights = np.ones_like(k)/len(k)
plt.hist(k, weights=weights)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
结果:
我做错了什么?
由于
答案 0 :(得分:13)
当您绘制标准化的直方图时,高度不应该总和为1,但曲线下面的区域应总计为1:
In [44]:
import matplotlib.pyplot as plt
k=(3,3,3,3)
x, bins, p=plt.hist(k, density=True) # used to be normed=True in older versions
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
In [45]:
print bins
[ 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5]
这里,这个例子,bin宽度是0.1,曲线下方的面积总和为1(0.1 * 10)。
要将高度之和设为1,请在plt.show()
之前添加以下内容:
for item in p:
item.set_height(item.get_height()/sum(x))
答案 1 :(得分:4)
一种方法是自己获取概率,然后使用plt.bar
绘图:
In [91]: from collections import Counter
...: c=Counter(k)
...: print c
Counter({1: 2, 3: 1, 4: 1})
In [92]: plt.bar(prob.keys(), prob.values())
...: plt.show()
结果:
答案 2 :(得分:1)
定义标准直方图,使得每列的宽度和高度的乘积之和等于总计数。这就是为什么你没有让你的最大值等于一。
但是,如果您仍想将其强制为1,则可以通过以下方式使用numpy和matplotlib.pyplot.bar
sample = np.random.normal(0,10,100)
#generate bins boundaries and heights
bin_height,bin_boundary = np.histogram(sample,bins=10)
#define width of each column
width = bin_boundary[1]-bin_boundary[0]
#standardize each column by dividing with the maximum height
bin_height = bin_height/float(max(bin_height))
#plot
plt.bar(bin_boundary[:-1],bin_height,width = width)
plt.show()
答案 3 :(得分:1)
您可以使用here概述的解决方案:
weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)
答案 4 :(得分:1)
上面的行如何显示
weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)
当我有一个堆积的直方图时应该工作吗?-
n, bins, patches = plt.hist([from6to10, from10to14, from14to18, from18to22, from22to6],
label= ['06:00-10:00','10:00-14:00','14:00-18:00','18:00- 22:00','22:00-06:00'],
stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr),
stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr), np.nanmax(ref1arr)), bins=10)