使用matplotlib在一个图中绘制具有不同数据点长度的2个直方图

时间:2016-01-26 12:25:19

标签: python matplotlib plot histogram

我有两组数据,其中一组包含大约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()

enter image description here

请告诉我这是否是解决此问题的好方法?我想将两个直方图频率之间的最高高度匹配为1(或100%)。

1 个答案:

答案 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,但至少它快速而肮脏:))

相关问题