Ushahidi是一家非盈利软件公司,人们可以通过短信向其提供有关自然灾害和地缘政治事件的信息。这些数据会被发布在他们的网站上以提供分析和图形化。本节,利用2010年海底地震及其余震期间搜集的数据。
数据下载在 https://download.csdn.net/download/qq_21467113/10828284
该练习为Python2代码,主要是Python3不支持Basemap。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
data = pd.read_csv('D:\programme\sqldata\Haiti.csv')
data = data[(data.LATITUDE>18)&(data.LATITUDE<20)&(data.LONGITUDE>-75)&(data.LONGITUDE<-70)&data.CATEGORY.notnull()]
def to_cat_list(catstr):
stripped = (x.strip() for x in catstr.split(','))
return [x for x in stripped if x]
def get_all_categories(cat_series):
cat_sets = (set(to_cat_list(x)) for x in cat_series)
return sorted(set.union(*cat_sets))
def get_english(cat):
code,names = cat.split('.')
if '|' in names:
names = names.split('|')[1]
return code,names.strip()
all_cats = get_all_categories(data.CATEGORY)
english_mapping = dict(get_english(x) for x in all_cats)
def get_code(seq):
return [x.split('.')[0] for x in seq if x]
all_codes = get_code(all_cats)
code_index = pd.Index(np.unique(all_codes))
dummy_frame = pd.DataFrame(np.zeros((len(data), len(code_index))), index = data.index, columns = code_index)
for row,cat in zip(data.index,data.CATEGORY):
codes = get_code(to_cat_list(cat))
dummy_frame.ix[row,codes] = 1
data = data.join(dummy_frame.add_prefix('category_'))
def basic_haiti_map(ax=None,lllat=17.25,urlat=20.25,lllon=-75,urlon=-71):
m = Basemap(ax=ax,projection='stere',lon_0=(urlon + lllon)/2,
lat_0=(urlat + lllat)/2, llcrnrlat=lllat,
urcrnrlat=urlat,llcrnrlon=lllon,urcrnrlon=urlon,
resolution='f')
m.drawcoastlines()
m.drawstates()
m.drawcountries()
return m
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(12,10))
fig.subplots_adjust(hspace=0.05,wspace=0.05)
to_plot = ['2a','1','3c','7a']
lllat=17.25; urlat=20.25; lllon=-75; urlon=-71
for code,ax in zip(to_plot,axes.flat):
m = basic_haiti_map(ax, lllat=lllat,urlat=urlat,
lllon=lllon, urlon=urlon)
cat_data = data[data['category_%s' %code]==1]
x,y = m(cat_data.LONGITUDE.values,cat_data.LATITUDE.values)
m.plot(x,y, 'k.', alpha=0.5)
ax.set_title('%s: %s' %(code,english_mapping[code]))
print("over!!")
plt.show()
处理结果为: