目录
1.载入地图图片,创建随机分布的散列点,这些散列点以某些坐标正态分布,构成一些热点。
2.调用scipy.ndimage.filters.aussian_filter对频度图进行高斯模糊处理
3.修改热点图的alpha通道,将热点图与地图叠加显示
1.载入地图图片,创建随机分布的散列点,这些散列点以某些坐标正态分布,构成一些热点。
import matplotlib.pyplot as plt import numpy as np from scipy.ndimage import filters img=plt.imread("./img/China.png") h,w,_=img.shape xs,ys=[],[] for i in range(100): mean=w*np.random.rand(),h*np.random.rand() a=50+np.random.randint(50,200) b=50+np.random.randint(50,200) c=(a+b)*np.random.normal()*0.2 cov=[[a,c],[c,b]] count=200 x,y=np.random.multivariate_normal(mean,cov,size=count).T xs.append(x) ys.append(y) x=np.concatenate(xs) y=np.concatenate(ys) hist,_,_=np.histogram2d(x,y,bins=(np.arange(0,w),np.arange(0,h)))
上述代码部分函数的功能:
numpy.random.rand()#生成单个随机数 numpy.random.randint(a,b)#生成[a,b)的随机数 numpy.random.normal()#从正态分布中随机抽取样本 numpy.random.multivariate_normal()#从多元正态分布中随机抽取样本组成一个N维数组。并返回该数组 numpy.concatenate()#一次完成多个数组的拼接 numpy.histogram2d()#返回二维直方图
使用numpy.histogram2d()在地图图片的网络中统计二维散列点的频度。
2.调用scipy.ndimage.filters.aussian_filter对频度图进行高斯模糊处理
heat=filters.gaussian_filter(hist,10.0)
相当于在每隔亮点处描绘一个高斯曲面,让每个亮点增加其周围的像素亮度
第二个参数为高斯曲面宽度(高斯分布的标准差),此参数越大,热点图也越平滑。
3.修改热点图的alpha通道,将热点图与地图叠加显示
plt.imshow(img)
plt.imshow(heat,alpha=0.5,cmap='rainbow')
修改alpha的值确定透明度
完整代码:
import matplotlib.pyplot as plt import numpy as np from scipy.ndimage import filters img=plt.imread("./img/China.png") h,w,_=img.shape xs,ys=[],[] for i in range(100): mean=w*np.random.rand(),h*np.random.rand() a=50+np.random.randint(50,200) b=50+np.random.randint(50,200) c=(a+b)*np.random.normal()*0.2 cov=[[a,c],[c,b]] count=200 x,y=np.random.multivariate_normal(mean,cov,size=count).T xs.append(x) ys.append(y) x=np.concatenate(xs) y=np.concatenate(ys) hist,_,_=np.histogram2d(x,y,bins=(np.arange(0,w),np.arange(0,h))) hist=hist.T heat=filters.gaussian_filter(hist,10.0) plt.imshow(img) plt.imshow(heat,alpha=0.5,cmap='rainbow') plt.show()