小蛇学python(23)basemap入门与进阶

Basemap是matplotlib下的一个库文件,专门应用于绘制地图。这一节就来详细讲解该文件的使用。首先来绘制一个最简单的地图。代码结果如图1所示。

from mpl_toolkits.basemap import Basemap
map = Basemap() #实例化一个对象 map.drawcoastlines() #map调用函数,该函数内置世界地图海岸线
plt.savefig('image_name',bbox_inches='tight')       #去掉图片边缘空白区域 plt.show()
图1

如果觉得这样的地图过于单调,还可以给地图涂色。如图2所示。

from mpl_toolkits.basemap import Basemap
map = Basemap()
map.drawmapboundary(fill_color = 'aqua') #将整个地图涂上蓝色的一层 map.fillcontinents(color = 'coral') #将大陆部分涂上黄色 map.drawcoastlines()
plt.savefig('image_name',bbox_inches='tight')
plt.show()
图2

你也许觉得这样的世界地图有些变形,这是因为投影方式的不同,Basemap内置了24种投影方式,感兴趣的读者可以浏览Basemap手册仔细了解,本书不在这些细节上做过多牵扯。

当你不显式指定投影方式时,Basemap会默认上图的投影方式,这也是绘制世界地图普遍采用的投影方式。其特点就是越接近赤道的地区越真实,维度越高的地区越失真,看起来比真实情况要小。

当你并不想绘制世界地图时,可以根据显式指定上下纬度以及左右经度确定具体区域。

map = Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=55, resolution='i',
 projection='merc', lat_0=42.5, lon_0=120) #通过经纬度确定中国区域 map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral')
map.drawcoastlines()
map.drawcountries() #画出国家边界
plt.savefig('image_name', bbox_inches='tight')
plt.show()

一副漂亮的中国地图就画出来了。还添加了国家的边界,也是一句代码就可以完成的工作。如图3所示

图3

如果想进一步完成绘制中国地图的工作,添加上中国各省份的边界,这时候需要下载特定的数据文件。因为Basemap是外国人开发的库,因此并没有内置中国各省份的边界数据。

不过从https://gadm.org/download_country_v3.html中,可以下载到你想要的任何国家的省份边界数据。如图4所示。

map = Basemap(llcrnrlon=73, llcrnrlat=18, urcrnrlon=135, urcrnrlat=55, resolution='i',
 projection='merc', lat_0=42.5, lon_0=120)
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral')
map.drawcoastlines()
map.drawcountries()
map.readshapefile('gadm36_CHN_1', 'states', drawbounds=True) #读取各省边界数据 plt.savefig('image_name', bbox_inches='tight')
plt.show()
图4

有了以上的基础,接下来实现一个实例。利用之前的中国各省份GDP的数据文件,结合Basemap画一幅GDP热力图。代码如下,效果如图5所示。

from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from matplotlib.colors import rgb2hex
plt.figure(figsize=(16, 8))
map=Basemap(llcrnrlon=77,llcrnrlat=14,urcrnrlon=140,urcrnrlat=51,projection='lcc',lat_1=33,lat_2=45,lon_0=100)
map.drawcountries(linewidth=1.5)
map.drawcoastlines()
map.readshapefile('gadm36_CHN_1', 'states', drawbounds=True) #读取省份边界数据 df = pd.read_csv('Chinese_GDP.csv') #读取GDP数据 df.set_index('地区', inplace=True) #将列名为地区这一列设为索引 provinces = map.states_info #读取省份信息 statenames = []
colors = {}
cmap = plt.cm.YlOrRd                                           #指定色彩映射种类 GDP_max = max(df['2016年'])
GDP_min = min(df['2016年'])
for each_province in provinces: #for循环中是对shapefile格式数据的处理,与主要程序逻辑无关 province_name = each_province['NL_NAME_1']
 p = province_name.split('|')
 if len(p) > 1:
 s = p[1]
 else:
 s = p[0]
 s = s[:2]
 if s == '黑龍':
 s = '黑龙江'
 if s == '内蒙':
 s = '内蒙古'
 statenames.append(s)
 GDP = df['2016年'][s]
 colors[s] = cmap(np.sqrt((GDP - GDP_min) / (GDP_max - GDP_min)))[:3] #构建色彩映射关系 statenames.append('Taiwan') #将台湾的数据单独添加进去 GDP_Taiwan = df['2016年']['Taiwan']
colors['Taiwam'] = cmap(np.sqrt((GDP_Taiwan - GDP_min) / (GDP_max - GDP_min)))[:3]
ax = plt.gca()
for nshape, seg in enumerate(map.states):
 color = rgb2hex(colors[statenames[nshape]]) #将RGB色彩转为HEX色彩 poly = Polygon(seg, facecolor=color, edgecolor=color) #将每个省份对应的颜色进行填充 ax.add_patch(poly)
map.readshapefile('gadm36_TWN_0', 'states', drawbounds=True)
for nshape, seg in enumerate(map.states):
 color = rgb2hex(colors[statenames[nshape]]) #将RGB色彩转为HEX色彩 poly = Polygon(seg, facecolor=color, edgecolor=color) #将每个省份对应的颜色进行填充 ax.add_patch(poly)
ax.set_title('China GDP heatmap')
plt.savefig('image_name', bbox_inches='tight')
plt.show()
图5

关键步骤已经写了代码注释,不过还是从整体逻辑角度解释一下代码。

(1)设置展示地图区域的经纬度参数。

(2)读取内含中国大陆省份边界的数据文件,需要注意这些数据文件也是海外人士提供的,因为某些原因缺少台湾的数据,所以在后期把台湾的相关数据也补充添加进去了。

(3)读取中国各省份GDP数据,并将地区列设置为索引。

(4)比较关键,代码量也比较多,其完成了处理shapefile格式数据,设置色彩映射的功能。

(5)是进行色彩填充,以省份行政区域为单位进行循环,依次填充各省份GDP所对应的颜色。GDP越高,颜色越深。

最后案例对应数据可点赞后简信我索取。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容