我又来用Python画雪了。。
昨天写到后台留言问我具体怎么用Python画雪,我以为是问我怎么画gif动图呢,还特地写了一篇
如何用Python生成GIF动图?
(勘误:该文中生成GIF动图的代码中,第6行
但是之前展示的降雪gif动图,还是我今年1月份画的,现在原始数据也找不到了,最惨的是,代码也找不到了,难以复现图片。不过这难不倒机智的我!为了展示静态的图片,我可以把这个gif再转回png图片嘛
所以,大家其实感兴趣的是画下面这张图:
看到现在,相信你们已经get到了这个不好的消息了:
这个图我们现在已经不画啦!!脚本我也找不到了哈哈哈
不过一个丢了马的老头说过,丢了东西,也不一定是坏事。所以下面是好消息:
因为找不到老版本的代码,所以我不得不重新写,于是更新了一波产品,把上面表示降雪的圆点改用雪花来表示了。。
说个题外话,这种点图也可以用NCL绘制。
详见:
如何用NCL进行色标的动态设置
绘制上面这张图,主要的难点是两个,一个是在站点上根据站点数据用不同的颜色打点,还有一个是标注雨雪的marker和text。对于地图,我们还是采用的Basemap。虽然它已经停止更新了,但是为了系统的稳定性,我们还是一直沿用了下来。估计要等到Basemap死的透透的了,我们才能改cartopy吧。。
首先来看站点数据打点。主要的思路是通过判断站点上数值的大小来选择颜色进行打点,这一点跟NCL的思路一致:
。是不是看着比较像一个雪花的图案
。之所以这么写,就是因为matplotlib的默认marker里面,没有雪花❉
s表示marker的大小,默认为20,我这里想要大一点,就设成了60。
附matplotlib库marker表:
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
不应该缩进至循环中,而应该与for循环齐平)
结果发现,人家想问的是怎么画降雪的站点图。。
尴尬
![8519cf1cd8c8dca6476bdc4bd510e7c1.png](https://i-blog.csdnimg.cn/blog_migrate/19598266a17f7bfeaf1296d81fad0779.png)
![82ed68d31d0f4d643afb9c16d7853d17.png](https://i-blog.csdnimg.cn/blog_migrate/7722d6cf045cd9112927c20753925b48.png)
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图片,并统一存储在一个文件夹里面啦,就像下面这样:
![a70ec158aa9334e888dcc5fd80f01652.png](https://i-blog.csdnimg.cn/blog_migrate/d698831739535525586064b2f71712ad.png)
![ea8d96f17f6fe4a67419d93ec5079e4c.png](https://i-blog.csdnimg.cn/blog_migrate/9ca7d66afeba6afe8253ff05dcb57681.png)
![8f45dec342849e39660e4d9f08d8b11d.png](https://i-blog.csdnimg.cn/blog_migrate/b243c30bb2771a87bd35b89ecbd76cbc.png)
![8f45dec342849e39660e4d9f08d8b11d.png](https://i-blog.csdnimg.cn/blog_migrate/b243c30bb2771a87bd35b89ecbd76cbc.png)
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度,就像这样
![84f41dcd7d5b185cec2409639eea0a3d.png](https://i-blog.csdnimg.cn/blog_migrate/d4a26a7c585ccc41610eac0d76a2eb1f.png)
![6b893cb54807fe9c741d9985f21223d7.png](https://i-blog.csdnimg.cn/blog_migrate/bb2334dd1a8b7232968308585b88b0e9.png)
![5bf65239a7206cc9f817bc3c69a9d63f.png](https://i-blog.csdnimg.cn/blog_migrate/3bb9dfa582194027638f8cb723d4e988.png)