imageio.mimsave(gif_name, frames, 'GIF', duration=duration)


不应该缩进至循环中,而应该与for循环齐平) 结果发现,人家想问的是怎么画降雪的站点图。。 尴尬

python画图节点分布位置 python怎么画分布图_python画二维正态分布图


但是之前展示的降雪gif动图,还是我今年1月份画的,现在原始数据也找不到了,最惨的是,代码也找不到了,难以复现图片。不过这难不倒机智的我!为了展示静态的图片,我可以把这个gif再转回png图片嘛

python画图节点分布位置 python怎么画分布图_Python_02

from PIL import Imageimport osdir_gif = "./"file_gif = "20200109115246.gif"dir_png = "./png"im = Image.open(os.path.join(dir_gif,file_gif))if not os.path.isdir(dir_png):    os.mkdir(dir_png)try:    while True:        current = im.tell()        im.save(os.path.join(dir_png,str(current)+'.png'))        im.seek(current+1)except EOFError:        pass


上面的代码中,dir_gif和dir_png使用的是相对路径,在实际代码写作过程中,最好写成绝对路径,这样就算代码迁移,也不容易发生错误。os.path.join是个非常好用的目录和文件名的拼接函数,它可以避免用字符串的直接相加来生成目录和文件名时缺少“/”造成的错误。 用这段代码就可以把gif拆分成以数字命名的png图片,并统一存储在一个文件夹里面啦,就像下面这样:

python画图节点分布位置 python怎么画分布图_python画二维正态分布图_03


所以,大家其实感兴趣的是画下面这张图:

python画图节点分布位置 python怎么画分布图_python画图节点分布位置_04


看到现在,相信你们已经get到了这个不好的消息了: 这个图我们现在已经不画啦!!脚本我也找不到了哈哈哈

python画图节点分布位置 python怎么画分布图_Python_05

python画图节点分布位置 python怎么画分布图_Python_05


不过一个丢了马的老头说过,丢了东西,也不一定是坏事。所以下面是好消息: 因为找不到老版本的代码,所以我不得不重新写,于是更新了一波产品,把上面表示降雪的圆点改用雪花来表示了。。 说个题外话,这种点图也可以用NCL绘制。 详见: 如何用NCL进行色标的动态设置 绘制上面这张图,主要的难点是两个,一个是在站点上根据站点数据用不同的颜色打点,还有一个是标注雨雪的marker和text。对于地图,我们还是采用的Basemap。虽然它已经停止更新了,但是为了系统的稳定性,我们还是一直沿用了下来。估计要等到Basemap死的透透的了,我们才能改cartopy吧。。 首先来看站点数据打点。主要的思路是通过判断站点上数值的大小来选择颜色进行打点,这一点跟NCL的思路一致:

mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题plt.figure()cmpfile='TP_cma.rgb'cmpdata=np.loadtxt(cmpfile)cmpdata=cmpdata/255.0fig=plt.figure(figsize=[5.5,5],dpi=300)plt.subplots_adjust(top=0.95, bottom=0.05, right=0.85, left=0.05, hspace=0, wspace=0)color_data = np.zeros((len(pic_data),3))for i in range(0, len(pic_data)):    if pre[i]<2.5:        color_data[i,:] = color=cmpdata[1]    if pre[i]>=2.5 and pre[i]<5:        color_data[i,:] = color=cmpdata[2]    if pre[i]>=5 and pre[i]<10:        color_data[i,:] = color=cmpdata[3]    if pre[i]>=10:        color_data[i,:] = color=cmpdata[4]    if pic_data[i]>=70:        plt.scatter(lon[i], lat[i], marker = (6, 2, 90),color=color_data[i], s = 50)        plt.text(lon[i]-0.065, lat[i]-0.16,pre[i],fontdict={'size':'6','color':'k'})


下面,是标注marker和text:

plt.scatter(121.3,35.75,color=cmpdata[1],s = 60)plt.scatter(121.3,35.5,color=cmpdata[2],s = 60)plt.scatter(121.3,35.25,color=cmpdata[3],s = 60)plt.scatter(121.3,35.,color=cmpdata[4],s = 60)plt.scatter(120.6,35.75,marker = (6, 2, 90),color=[255/255.0, 215/255.0, 0],s = 60)plt.scatter(120.6,35.5,marker = (6, 2, 90),color=[190/255.0, 190/255.0, 190/255.0],s = 60)plt.scatter(120.6,35.25,marker = (6, 2, 90),color=[112/255.0, 128/255.0, 144/255.0],s = 60)plt.scatter(120.6,35.,marker = (6, 2, 90),color=[105/255.0, 105/255.0, 105/255.0],s = 60)plt.text(121.4,35.7,"小雨",fontdict={'size':'8','color':'k'})plt.text(121.4,35.45,"中雨",fontdict={'size':'8','color':'k'})plt.text(121.4,35.2,"大雨",fontdict={'size':'8','color':'k'})plt.text(121.4,34.95,"暴雨",fontdict={'size':'8','color':'k'})plt.text(120.7,35.7,"雨夹雪",fontdict={'size':'8','color':'k'})plt.text(120.7,35.45,"小雪",fontdict={'size':'8','color':'k'})plt.text(120.7,35.2,"中雪",fontdict={'size':'8','color':'k'})plt.text(120.7,34.95,"大雪",fontdict={'size':'8','color':'k'})


不同量级降雨的plt.scatter里没有写marker,因为默认为marker='o',就是circle(实心圆圈)。不同量级降雪的plt.scatter里面,marker = (6, 2, 90)表示marker为6边形,中心辐散,旋转90度,就像这样

python画图节点分布位置 python怎么画分布图_python画图节点分布位置_07


。是不是看着比较像一个雪花的图案

python画图节点分布位置 python怎么画分布图_文件名_08


。之所以这么写,就是因为matplotlib的默认marker里面,没有雪花❉

python画图节点分布位置 python怎么画分布图_python画二维正态分布图_09


s表示marker的大小,默认为20,我这里想要大一点,就设成了60。 附matplotlib库marker表:

python画图节点分布位置 python怎么画分布图_文件名_10