飓风“桑迪”路径图的制作
时间:2022-04-22
本文章向大家介绍飓风“桑迪”路径图的制作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
飓风"桑迪" (Sandy)横扫美国东部,并在纽约附近登录,带走113条人命,并造成500亿美元的损失,桑迪也被列为美国历史上最昂贵的飓风。我们今天利用之前介绍过的Python的matplotlib和basemap包,来制作桑迪的路径图,重构桑迪的整个发育过程。
、
下面是做成动画效果的GIF图 (由于博客园不允许上传2M以上的图片,所以分辨率有限,但你总可以作出一个高分辨率的动画。)
我在图画中加入阴影,以显示夜晚时间。可以看到,桑迪形成之后,先在巴拿马附近徘徊,随后穿过古巴,并在此过程中加强为Hurricane-2。随后桑迪划过美国东海岸,之后突然转向西,直奔纽约,并于29日下午在纽约南侧登录。
下载:数据文件
数据文件中的wind(最大风速)单位为knot,pressure(气压)单位为mb,时间为世界时。
绘制路径图的Python源码
# Written by Vamei
from datetime import datetime, timedelta
import re
import numpy as np
import matplotlib
matplotlib.rcParams['text.color'] = 'white'
matplotlib.rcParams['xtick.color'] = 'white'
matplotlib.rcParams['ytick.color'] = 'white'
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
font = 'monospace'
# This function is to plot the base map
def plotBase(fig, dt=None):
m = Basemap(projection='merc',
lon_0=0,lat_0=0,lat_ts=0,
llcrnrlat=0,urcrnrlat=50,
llcrnrlon=-100,urcrnrlon=-50,
resolution='l')
m.drawcountries(linewidth=1, color='k')
m.drawmapscale(-90, 5, -90, 5, 1000, barstyle='fancy')
m.bluemarble(scale=1)
# Get Position of NYC, longitude -74.0064, latitude 40.7142
x,y = m(-74.0064, 40.7142)
# Plot NYC
m.scatter(x, y, s=100, marker='*', color='0.5', alpha=1)
plt.text(x,y,'NYC', fontsize='15')
if dt is not None: m.nightshade(dt, alpha = 0.3)
return m
# Hurricane category colors
color_dict = {'TROPICAL DEPRESSION':'#AEF100', 'TROPICAL STORM':'#FFD600', 'HURRICANE-1':'#FF6440', 'HURRICANE-2':'#8506A9'}
# Read data file, unzip from track.zip to get track.dat
fn = 'track.dat'
rec = {'lat':[],'lon':[],'wind':[],'press':[],'dt':[],'cat':[]}
for i,line in enumerate(file(fn)):
if i == 0: continue # Jump over the first line
# replace multiple whitespaces with a single whitespace
line = re.sub(r"s+", ' ', line)
pieces = line.split(" ")
# retrieve information
rec['lat'].append(float(pieces[0]))
rec['lon'].append(float(pieces[1]))
rec['wind'].append(float(pieces[3]))
rec['press'].append(float(pieces[4]))
rec['cat'].append((" ".join(pieces[5:])).strip())
time = pieces[2]
time = "2012/" + time
rec['dt'].append(datetime.strptime(time,"%Y/%m/%d/%HZ"))
# Plot the track and the else
N = len(rec['lat'])
for idx in range(N):
dt = rec['dt'][idx]
# Adjust time zone according to NYC
lt = dt - timedelta(hours=5)
lon = rec['lon'][idx]
lat = rec['lat'][idx]
wind = rec['wind'][idx]
press = rec['press'][idx]
cat = rec['cat'][idx]
fig = plt.figure()
m = plotBase(fig, dt)
# From lon,lat to pixels
x,y = m(lon, lat)
# Plot track
for i in range(idx):
a0,b0 = m(rec['lon'][i], rec['lat'][i])
a1,b1 = m(rec['lon'][i+1], rec['lat'][i+1])
m.plot((a0,a1),(b0,b1), linewidth=2.5,
color=color_dict[rec['cat'][i+1]])
# Plot Sandy's current position
m.scatter(x, y, s=100, c=color_dict[cat], alpha=0.8)
# Annotate current position
plt.annotate(
cat,
xy = (x, y), xytext = (-5, -30),
textcoords = 'offset points', ha = 'right', va = 'bottom',
bbox = dict(boxstyle = 'round,pad=0.5', fc=color_dict[cat], alpha = 0.8),
arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
tx, ty = m(-98, 40)
plt.text(tx,ty,
lt.strftime("Hurricane SandynnNYC LT:n%Y-%m-%d %H:00:00nData Source: NOAAnBy Vamei"),
family=font,ha='left')
# add a small axes to show pressure
a = fig.add_axes([0.6,0.2,.15,.1])
a.set_ylim((950,1000))
a.set_xlim((-10,70))
a.set_yticks([900,1050])
a.set_xticks([0,60])
a.set_title("Center Pressure (mb)", fontsize=10)
a.plot(rec['press'])
a.axvline(x=idx, color='r')
# add a small axes to show wind
a = fig.add_axes([0.6,0.4,.15,.1])
a.set_ylim((0,100))
a.set_xlim((-10,70))
a.set_yticks([0,100])
a.set_xticks([0,60])
a.set_title("Max Wind (knots)", fontsize=10)
a.plot(rec['wind'])
a.axvline(x=idx, color='r')
fig.savefig(('%04d.png' % idx))
plt.close()
下面放一个桑迪的卫星图,显示一下桑迪的惊人尺寸(来自NASA的GOES卫星)
桑迪带来的大小灾难:
- [转自JeffreyZhao]在LINQ to SQL中使用Translate方法以及修改查询用SQL
- Flask-SQLAlchemy
- 2017全球存储大会:存储设备面临三大挑战
- cobbler自动安装系统(Centos7.X)
- Python接口自动化-7-unittest
- cobbler自动安装系统(Centos7.X)
- Linux NTP时间服务器
- 子查询的另一种方式——映射
- LNMP架构之搭建wordpress博客网站
- Nginx的各种报错总结
- 谷歌TensorFlowLite正式发布,机器学习框架向移动端大步挺进!
- ABP+AdminLTE+Bootstrap Table权限管理系统一期
- 18888元秒下的域名sdhlx.com已建站
- 锂离子电池发明人:自动驾驶汽车电池需要更加耐用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯云TcaplusDB基础能力介绍
- 游戏架构上云实战
- 【JUC】CyclicBarrier的了解和使用
- 完美解决-RuntimeError: CUDA error: device-side assert triggered
- springmvc之异常处理SimpleMappingExceptionResolver
- 剑指offer(13-15)题解
- 【leetCode】青蛙跳台问题(这只青蛙会托马斯大旋转)day07
- 【leetCode】斐波那契数列day06
- 剑指offer(61-67)题解
- 宇智波程序笔记8-【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
- 情感分析数据预处理过程
- java的内部类和静态内部类(嵌套类)
- python爬取B站视频弹幕分析并制作词云
- mybatis扩展之自定义类型处理器处理枚举类型
- IMDB影评数据集预处理(使用word2vec)