|
|
@ -1,8 +1,9 @@ |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
|
|
import csv |
|
|
|
from dataclasses import dataclass |
|
|
|
from dataclasses import dataclass, field |
|
|
|
from datetime import datetime |
|
|
|
from typing import List |
|
|
|
|
|
|
|
import cartopy.crs as ccrs |
|
|
|
import matplotlib.pyplot as plt |
|
|
@ -73,6 +74,7 @@ class Tornado: |
|
|
|
self.slat = float(self.slat) |
|
|
|
self.elon = float(self.elon) |
|
|
|
self.elat = float(self.elat) |
|
|
|
self.mag = int(self.mag) |
|
|
|
|
|
|
|
def __repr__(self): |
|
|
|
return "<tornado {id} {date}>".format(id=self.id, date=self.dt) |
|
|
@ -87,34 +89,76 @@ def read_data(): |
|
|
|
return tornados |
|
|
|
|
|
|
|
|
|
|
|
def draw_map(lons, lats): |
|
|
|
def draw_map(f_unknown, f_zero, f_one, f_two, f_three, f_four, f_five): |
|
|
|
fig = plt.figure(frameon=False, figsize=(8, 4.61)) |
|
|
|
ax = fig.add_axes([0, 0, 1, 1], projection=proj) |
|
|
|
ax.background_patch.set_facecolor(water_blue) |
|
|
|
ax.set_extent([-122, -65, 20, 50], ccrs.Geodetic()) |
|
|
|
ax.add_feature(land, facecolor="#f0f0f0") |
|
|
|
ax.add_feature(rivers, edgecolor=water_blue) |
|
|
|
# ax.add_feature(rivers, edgecolor=water_blue) |
|
|
|
ax.add_feature(lakes, facecolor=water_blue) |
|
|
|
|
|
|
|
ax.add_feature(countries, edgecolor="grey", linewidth=0.2, alpha=0.6, dashes='--') |
|
|
|
ax.add_feature(states, edgecolor="grey", linewidth=0.2, alpha=0.4, dashes='--') |
|
|
|
|
|
|
|
ax.plot(lons, lats, 'r', lw=0.2, alpha=0.7, transform=ccrs.Geodetic()) |
|
|
|
geodetic = ccrs.Geodetic() |
|
|
|
ax.plot(f_unknown.lons, f_unknown.lats, 'k', lw=0.2, alpha=0.7, label="Unknown", transform=geodetic) |
|
|
|
ax.plot(f_zero.lons, f_zero.lats, '#ffbb00', lw=0.1, alpha=1, label="F0", transform=geodetic) |
|
|
|
ax.plot(f_one.lons, f_one.lats, '#ff7700', lw=0.1, alpha=1, label="F1", transform=geodetic) |
|
|
|
ax.plot(f_two.lons, f_two.lats, '#ff4400', lw=0.2, alpha=0.8, label="F2", transform=geodetic) |
|
|
|
ax.plot(f_three.lons, f_three.lats, '#ff1100', lw=0.3, alpha=0.8, label="F3", transform=geodetic) |
|
|
|
ax.plot(f_four.lons, f_four.lats, 'r', lw=0.4, alpha=0.8, label="F4", transform=geodetic) |
|
|
|
ax.plot(f_five.lons, f_five.lats, 'r', lw=0.6, alpha=0.7, label="F5", transform=geodetic) |
|
|
|
|
|
|
|
ax.axis('off') |
|
|
|
|
|
|
|
plt.legend(loc=4, title="Intensity", fontsize='small') |
|
|
|
plt.savefig("tornados_us.png", dpi=320) |
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
|
class Fmag: |
|
|
|
lons: List[int] = field(default_factory=list) |
|
|
|
lats: List[int] = field(default_factory=list) |
|
|
|
|
|
|
|
|
|
|
|
def append(collection, tornado): |
|
|
|
collection.lons.append(tornado.slon) |
|
|
|
collection.lats.append(tornado.slat) |
|
|
|
if tornado.elon < 0: |
|
|
|
collection.lons.append(tornado.elon) |
|
|
|
collection.lats.append(tornado.elat) |
|
|
|
else: |
|
|
|
collection.lons.append(tornado.slon) |
|
|
|
collection.lats.append(tornado.slat) |
|
|
|
collection.lons.append(None) |
|
|
|
collection.lats.append(None) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
ts = read_data() |
|
|
|
lons = [] |
|
|
|
lats = [] |
|
|
|
|
|
|
|
f_unknown = Fmag() |
|
|
|
f_zero = Fmag() |
|
|
|
f_one = Fmag() |
|
|
|
f_two = Fmag() |
|
|
|
f_three = Fmag() |
|
|
|
f_four = Fmag() |
|
|
|
f_five = Fmag() |
|
|
|
for t in ts: |
|
|
|
if t.elon < 0: |
|
|
|
lons.append(t.slon) |
|
|
|
lons.append(t.elon) |
|
|
|
lons.append(None) |
|
|
|
lats.append(t.slat) |
|
|
|
lats.append(t.elat) |
|
|
|
lats.append(None) |
|
|
|
draw_map(lons, lats) |
|
|
|
if t.mag == 0: |
|
|
|
append(f_zero, t) |
|
|
|
elif t.mag == 1: |
|
|
|
append(f_one, t) |
|
|
|
elif t.mag == 2: |
|
|
|
append(f_two, t) |
|
|
|
elif t.mag == 3: |
|
|
|
append(f_three, t) |
|
|
|
elif t.mag == 4: |
|
|
|
append(f_four, t) |
|
|
|
elif t.mag == 5: |
|
|
|
append(f_five, t) |
|
|
|
else: |
|
|
|
append(f_unknown, t) |
|
|
|
|
|
|
|
draw_map(f_unknown, f_zero, f_one, f_two, f_three, f_four, f_five) |