飓风“桑迪”路径图的制作

飓风"桑迪" (Sandy)横扫美国东部,并在纽约附近登录,带走113条人命,并造成500亿美元的损失,桑迪也被列为美国历史上最昂贵的飓风。我们今天利用之前介绍过的Python的matplotlibbasemap包,来制作桑迪的路径图,重构桑迪的整个发育过程。

下面是做成动画效果的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 Sandy\n\nNYC LT:\n%Y-%m-%d %H:00:00\nData Source: NOAA\nBy 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卫星)

桑迪带来的大小灾难:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

最常见的仪器仪表原理动图,工程师一看就能懂!

一、温度仪表原理 1.薄膜热电偶的结构 ? 2.固体膨胀式温度计 ? 3.热电偶补偿导线的外形图 ? 4.热电偶温度计 ? 5.热电阻的结构 ? 二、压力仪表原...

36511
来自专栏Kurt Niu 的博客

我用C#写的CF外挂

        妈的,你就是想变瘦,你可以卖个减肥药什么的都可以,但是你卖女人就是不行。

3643
来自专栏大神带我来搬砖

记一次高级软件架构师的铩羽而归

前几天女朋友笔记本电脑开机后进不了系统了,鉴于我天天告诉她要用宏来处理Excel,于是耳提面命,让我来修修。当时我想,这有何难,哪有程序员修不了电脑的?正如马谡...

3538
来自专栏生信技能树

一篇文章学会ChIP-seq分析(上)

写在前面:《一篇文章学会ChIP-seq分析(上)》《一篇文章学会ChIP-seq分析(下)》为生信菜鸟团博客相关文章合集,共九讲内容。带领你从相关文献解读、资...

2.7K6
来自专栏Java帮帮-微信公众号-技术文章全总结

Java案例-俄罗斯方块/蜘蛛纸牌

《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。 该游戏曾经被多家公司代理过。经过多轮诉...

4147
来自专栏iOSDevLog

初试 iOS 11 新框架:Vision Framework 让文字检测变得更容易

5204
来自专栏蓝天

Mac Pro Windows 8屏幕偏暗原因

实际使用过程中会发现,刚进入Windows时,屏幕很亮,但一会儿就暗下来了,之后怎么调节也亮不起来,调到最亮也偏暗。这说明Mac Pro本身还是可以很亮的,应当...

892
来自专栏阮一峰的网络日志

键盘之争:QWERTY还是Dvorak

上图是现在通用的QWERTY键盘,以键盘第一排字母的左边6个字母而得名。这种键盘是1868年由Christopher Sholes申请专利,后来在全世界占据了主...

3258
来自专栏程序生活

Python爬虫系列(七)豆瓣图书排行榜(数据存入到数据库)

豆瓣用户每天都在对“读过”的书进行“很差”到“力荐”的评价,豆瓣根据每本书读过的人数 以及该书所得的评价等综合数据,通过算法分析产生了豆瓣图书250。 网址:豆...

3814
来自专栏Data Analysis & Viz

百年百图の中国(1900-1999):另类python爬虫和PIL拼图

标题有点长,也有点怪。前半部分文艺向,后半部分python技术向。目的就是用PIL库得到100张图的拼图(成果图见文末)。

832

扫码关注云+社区

领取腾讯云代金券