慈溪企业网站seo,app和手机网站的区别是什么,漳州正规网站建设费用,网站开发资金Basemap地图绘制 安装和使用地图投影地图背景在地图上画数据 Basemap是Matplotlib的一个子包#xff0c;负责地图绘制。在数据可视化过程中#xff0c;我们常需要将数据在地图上画出来。 比如说我们在地图上画出城市人口#xff0c;飞机航线#xff0c;军事基地#xff0c… Basemap地图绘制 安装和使用地图投影地图背景在地图上画数据 Basemap是Matplotlib的一个子包负责地图绘制。在数据可视化过程中我们常需要将数据在地图上画出来。 比如说我们在地图上画出城市人口飞机航线军事基地矿藏分布等等。这样的地理绘图有助于读者理解空间相关的信息。适用于有空间位置的数据集。 安装和使用
相对于其他工具Basemap用起来有点笨重就算做点儿简单的可视化图也需要花费比预期更长的时间。
在处理比较复杂的地图可视化任务时更现代的解决方案可能会更适用一些比如leaflet 、Google Maps API。然而Basemap 符合Python用户的使用习惯。
basemap并没有集成到matplotlib中需要我们手动安装basemap安装起来很简单。
安装命令 pip install basemap 安装完并导入basemap工具箱后只需要用几行代码就可以画出地理图
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemapplt.figure(figsize(8, 8))
m Basemap(projectionortho, resolutionNone, lat_050, lon_0-100)
m.bluemarble(scale0.5)# 显式设置数据范围
plt.imshow(m.bluemarble(scale0.5), originupper, vmin0, vmax1)plt.show()下面使用了 mill 投影方式设置了地图的经纬度范围绘制了海岸线、国家边界以及经纬度网格也可以根据需要调整投影方式和绘制的内容
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap# 创建一个地理图
m Basemap(projectionmill, llcrnrlat-60, urcrnrlat90, llcrnrlon-180, urcrnrlon180, resolutionc)# 绘制海岸线和国家边界
m.drawcoastlines()
m.drawcountries()# 绘制经纬度网格
m.drawparallels(range(-90, 91, 30), labels[1, 0, 0, 0])
m.drawmeridians(range(-180, 181, 60), labels[0, 0, 0, 1])plt.title(World Map)
plt.show() 运用Basemap函数我们可以在绘图区域中绘制地理信息相关的图像当参数 projection的值为ortho时我们将得到一个如上图所示的地球仪截面。 将参数projection的值设置为lcc时我们可以通过经纬度设置来得到某一区域的局部地图
fig plt.figure(figsize(8, 8))
m Basemap(projectionlcc, resolutionNone,width8E6,height8E6,lat_045,lon_0-100)m.etopo(scale0.5, alpha0.5)
# 将经纬度映射为 (x, y) 坐标用于绘制图像
x, y m(-122.3, 47.6)
plt.plot(x, y, ok, markersize5)
plt.text(x, y, Seattle, fontsize12)这里使用了两个额外参数它们用来表示地图中心的纬度lat_0和经度 lon_0。
地图投影
由于不可能把地表完美反映到二维平面上所有的地图都是各种各样扭曲的产物把这些扭曲的产物抹平到平面坐标系的过程称为投影。
Basemap提供了几十种不同的投影的实现。
投影简写-全称对照
下面我们对一常用的投影进行简单的演示。定义一个可以画带经纬线地图的简便方法
def draw_map(m, scale0.2):# 画地貌晕渲图m.shadedrelief(scalescale)# 用字典表示经纬度lats m.drawparallels(np.linspace(-90, 90, 13))lons m.drawmeridians(np.linspace(-180, 180, 13))# 字典的键是plt.Line2D示例lat_lines chain(*(tup[1][0] for tup in lats.items()))lon_lines chain(*(tup[1][0] for tup in lons.items()))all_lines chain(lat_lines, lon_lines)# 用循环将所有线设置成需要的样式for line in all_lines:line.set(linestyle-, alpha0.3, colorw)圆柱投影是最简单的地图投影类型纬度线与经度线分别映射成水平线与竖直线。 采用这种投影类型的话赤道区域的显示效果非常好但是南北极附近的区域就会严重变形。
fig plt.figure(figsize(8, 6), edgecolorw)
m Basemap(projectioncyl, resolutionNone,
llcrnrlat-90, urcrnrlat90,
llcrnrlon-180, urcrnrlon180, )
draw_map(m)这里basemap参数设置了左下角llcrnr和右上角urcrnr纬度lat和经度lon。不同的投影都有各种的优劣大家之后可以多多尝试。
地图背景
basemap程序包中有许多实用的函数可以画出各种地形的轮廓如陆地、海洋、湖泊、河流、各国的政治分界线。
常用画图函数
如果要使用边界特征就必须设置分辨率。通过resolution来设置分辨率取值为c原始分辨率、l低分辨率、i中分辨率、h高分辨率、f全画质分辨率。
来看看两种不同分辨率的绘制效果:
fig, ax plt.subplots(1, 2, figsize(12, 8))
for i, res in enumerate([l, h]):m Basemap(projectiongnom, lat_057.3, lon_0-6.2,width90000, height120000, resolutionres, axax[i])m.fillcontinents(color#FFDDCC, lake_color#DDEEFF)m.drawmapboundary(fill_color#DDEEFF)m.drawcoastlines()ax[i].set_title(resolution{0}.format(res));
plt.show()可以看出低分辨率不适合这个缩放低分辨率适合呈现全局视角而且加载速度比高分辨率更快。要呈现某一视角的适合最好先从一个能快速呈现的分辨率开始然后不断提高分辨率直到满意为止。
在地图上画数据
basemap还可以以地图为背景在这上面画各种数据。basemap实例中许多方法都是与地图有关的函数。这些函数与标准matplotlib函数的用法类似只是多了一个参数latlon。如果设置为true表示使用原来的经纬度坐标不使用投影(x,y)坐标。
示例如下
import pandas as pd
cities pd.read_csv(california_cities.csv)
# 提取我们感兴趣的数据
lat cities[latd].values
lon cities[longd].values
population cities[population_total].values
area cities[area_total_km2].values
# 1. 绘制地图背景
fig plt.figure(figsize(8, 8))
m Basemap(projectionlcc, resolutionh, lat_037.5, lon_0-119,width1E6, height1.2E6)
m.shadedrelief()
m.drawcoastlines(colorgray)
m.drawcountries(colorgray)
m.drawstates(colorgray)
# 2. 绘制城市数据的散点图其中颜色反映人口
# 尺寸反映面积
m.scatter(lon, lat, latlonTrue,cnp.log10(population), sarea,cmapReds, alpha0.5)
# 3. 创建颜色条和图例
plt.colorbar(labelr$\log_{10}({\rm population})$)
plt.clim(3, 7)
# 使用虚拟的点生成图例
for a in [100, 300, 500]:plt.scatter([], [], ck, alpha0.5, sa,labelstr(a) km$^2$)
plt.legend(scatterpoints1, frameonFalse,labelspacing1, loclower left);