我有两组数据,其中一组包含大约1100万个数据点,另一组数据大约为5000.我想在一个直方图上绘制它们。但由于尺寸的不同,我需要对频率进行标准化,以便我可以将它们绘制在同一个数字上。下面我模拟了我对数据所做的工作,以便能够绘制它们。我使用了normed = True。
from numpy.random import randn
import matplotlib.pyplot as plt
import random
datalist1=[]
for x in range(1,50000):
datalist1.append(random.uniform(1,2))
datalist2=randn(5000000)
fig= plt.figure(1)
plt.hist(datalist1,bins=20,color='b',alpha=0.3,label='theoretical',histtype='stepfilled', normed=True)
plt.hist(datalist2,bins=20,alpha=0.5,color='g',label='experimental',histtype='stepfilled',normed=True)
plt.xlabel("Value")
plt.ylabel("Normalised Frequency")
plt.legend()
plt.show()
请告诉我这是否是解决此问题的好方法?我想将两个直方图频率之间的最高高度匹配为1(或100%)。
答案 0 :(得分:1)
normed=True
设置将直方图标准化为区域 1.这使直方图成为概率密度函数估计值的解释。
简而言之,实际上不要在峰值上进行标准化,而是在区域上进行标准化。
但是如果你真的想按高度标准化,你可以修改直方图的多边形数据:
h = plt.hist(datalist1,bins=20,color='b',alpha=0.3,label='theoretical',histtype='stepfilled', normed=True)
p = h[2][0]
p.xy[:,1] /= p.xy[:, 1].max()
h = plt.hist(datalist2,bins=20,alpha=0.5,color='g',label='experimental',histtype='stepfilled',normed=True)
p = h[2][0]
p.xy[:,1] /= p.xy[:, 1].max()
这个解决方案感觉有点hackish,但至少它快速而肮脏:))