import numpy as np
from matplotlib import pyplot as plt
from scipy import interpolate #插值平滑
def getPoisson(lam,size):
'''返回服从参数为lam的泊松分布的一组整数np数组,元素个数为size'''
int_seq=np.random.poisson(lam,size)
#统计不同元素的个数
freq={}
for i in int_seq:
if(i not in freq): freq[i]=0
freq[i]+=1
arr=list(freq.keys())
arr.sort() #将数字升序排列
x_data=np.array(arr) #x坐标点
y_data=np.array([freq[i] for i in x_data]) #y坐标
return x_data,y_data
def showPoisson(data,itrplt_type=‘cubic’):
'''显示一组泊松分布图,默认平滑插值类型是'cubic',如果为None则不平滑'''
plt.figure()
for lam,size,color in data:
x,y=getPoisson(lam,size)
if(itrplt_type):
func=interpolate.interp1d(x,y,kind=itrplt_type)
xnew=np.arange(np.min(x),np.max(x),0.01)
ynew=func(xnew)
plt.plot(xnew,ynew,color=color,linewidth=2)
else:
plt.plot(x,y,color=color,linewidth=2)
plt.show()
showPoisson(data=[
(5,10000,'#990000'),(5,20000,'#D64700'),(5,40000,'#006699')
],itrplt_type='cubic')
注意,代码中使用平滑函数
func
时,参数xnew
的构造是xnew=np.arange(np.min(x),np.max(x),0.01)
,这是因为新的横坐标的上下界不能超过平滑函数的原始横坐标数据的上下界(min(x),min(y)
),否则会产生错误:ValueError: A value in xnew is below/above the interpolation range.