python画雪花_如何用Python画站点雪花图?

我又来用Python画雪了。。 昨天写到后台留言问我具体怎么用Python画雪,我以为是问我怎么画gif动图呢,还特地写了一篇 如何用Python生成GIF动图? (勘误:该文中生成GIF动图的代码中,第6行
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
不应该缩进至循环中,而应该与for循环齐平) 结果发现,人家想问的是怎么画降雪的站点图。。 尴尬 8519cf1cd8c8dca6476bdc4bd510e7c1.png 但是之前展示的降雪gif动图,还是我今年1月份画的,现在原始数据也找不到了,最惨的是,代码也找不到了,难以复现图片。不过这难不倒机智的我!为了展示静态的图片,我可以把这个gif再转回png图片嘛 82ed68d31d0f4d643afb9c16d7853d17.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 所以,大家其实感兴趣的是画下面这张图: ea8d96f17f6fe4a67419d93ec5079e4c.png 看到现在,相信你们已经get到了这个不好的消息了: 这个图我们现在已经不画啦!!脚本我也找不到了哈哈哈 8f45dec342849e39660e4d9f08d8b11d.png 8f45dec342849e39660e4d9f08d8b11d.png 不过一个丢了马的老头说过,丢了东西,也不一定是坏事。所以下面是好消息: 因为找不到老版本的代码,所以我不得不重新写,于是更新了一波产品,把上面表示降雪的圆点改用雪花来表示了。。 说个题外话,这种点图也可以用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度,就像这样 84f41dcd7d5b185cec2409639eea0a3d.png 。是不是看着比较像一个雪花的图案 6b893cb54807fe9c741d9985f21223d7.png 。之所以这么写,就是因为matplotlib的默认marker里面,没有雪花❉ 5bf65239a7206cc9f817bc3c69a9d63f.png s表示marker的大小,默认为20,我这里想要大一点,就设成了60。 附matplotlib库marker表:

3666be2ca82ebe3f275518eae3565021.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值