QQ:231469242 版权所有
——此文以纪念南京大屠杀79周年
今天我教你们如何用python的basemap包绘制轰炸东京的地图。
在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理信息系统都会带有这样的功能。今天我们讨论如何在Python上实现,并且使用免费的工具包。
matplotlib是Python常用的数据绘制包。它基于numpy的数组运算功能。matplotlib绘图功能强大,可以轻易的画出各种统计图形,比如散点图,条行图,饼图等。matplotlib常与numpy和scipy相配合,用于许多研究领域。他们是免费工具,但其功能足可以与科研界的大佬Matlab竞争。
Basemap是Matplotlib的一个子包,负责地图绘制。在数据可视化过程中,我们常需要将数据在地图上画出来。比如说我们在地图上画出城市人口,飞机航线,军事基地,矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。
Matplotlib官网:
http://matplotlib.org/
Basemap官网:
http://matplotlib.org/basemap/
通过学习basemap,我们设置北京为导弹发射基地,日本的东京,广岛,长崎,大阪为攻击目标,导弹发射轨迹分别为四条不同颜色曲线(红,黄,绿,蓝)。此脚本全部代码如下,并添加了中文注解。各位朋友可以亲手实践。(此图为缩略图)
# -*- coding: utf-8 -*- """ Created on Wed Dec 14 09:59:34 2016 #轰炸东京 @author: Administrator """ from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np # 创建一个fig对象,自定义fig的size fig = plt.figure(figsize=(30,35)) # 划分fig并且选择一个子图给ax变量 ax = fig.add_subplot(1,1,1) #width=2000,height=2000 m = Basemap(projection='mill', llcrnrlat=20, urcrnrlat=50, llcrnrlon=70, urcrnrlon=150) m.drawcoastlines() m.drawcountries(linewidth=2) #m.drawrivers() # bjlat, bjlon are lat/lon of Bei jing北京的经纬度 bjlat = 40; bjlon = 116 #tokyolat,tokyolon 表示东京的经纬度 tokyolat,tokyolon=35.42,139.46 #广岛坐标 Hiroshima_lat, Hiroshima_lon=34.24,132.27 #大阪坐标 Osaka_lat,Osaka_lon= 34.4,135.3 #长崎坐标 Nagasaki_lat,Nagasaki_lon=32.46,129.52 # draw parallels m.drawparallels(np.arange(10,90,20),labels=[1,1,0,1]) # draw meridians m.drawmeridians(np.arange(-180,180,30),labels=[1,1,0,1]) #m.drawmapboundary(fill_color='aqua') # fill continents, set lake color same as ocean color. #m.fillcontinents(color='coral',lake_color='aqua') def Draw_position(lon,lat,city,mark,markersize=100): xpt,ypt=m(lon,lat) #convert back to lat/lon lonpt,latpt=m(xpt,ypt,inverse=True) m.plot(xpt,ypt,mark,markersize) #plot a blue dot there plt.text(xpt+100000,ypt+100000,city) #绘制东京坐标 Draw_position(139.46,35.42,"Tokyo",'c*',100) #绘制北京坐标 Draw_position(116,40,"Beijign",'g^',100) #绘制广岛坐标 Draw_position(132.27,34.24,"Hiroshima",'c*',100) #绘制大阪坐标 Draw_position(135.3,34.4,"Osaka",'c*',100) #绘制长崎坐标 Draw_position(Nagasaki_lon,Nagasaki_lat,"Nagasaki",'c*',100) #tokyolat,tokyolon 表示萨德部署地的经纬度 THAADlat,THAADlon=36.119485,128.3445734 #绘制萨德坐标 Draw_position(128.3445734,36.119485,"THAAD",'c*',100) #链接北京和东京的路线 m.drawgreatcircle(bjlon,bjlat,tokyolon,tokyolat,linewidth=2,color='b') #链接北京和广岛的路线 m.drawgreatcircle(bjlon,bjlat,Hiroshima_lon,Hiroshima_lat,linewidth=2,color='r') #链接北京和大阪的路线 m.drawgreatcircle(bjlon,bjlat,Osaka_lon,Osaka_lat,linewidth=2,color='y') #链接北京和长崎的路线 m.drawgreatcircle(bjlon,bjlat,Nagasaki_lon,Nagasaki_lat,linewidth=2,color='g') #链接北京和萨德的路线 m.drawgreatcircle(bjlon,bjlat,THAADlon,THAADlat,linewidth=2,color='b') m.etopo() #添加图例,文字说明 plt.legend(loc=4) plt.title("Bomb Japs and Saad made by Toby!") plt.show()