Python資料科學之視覺化-BaseMap繪製地理影象

資料科學中,常用的一種視覺化型別是地理影象的繪製,Matplotlib中繪製這一型別影象的是

BaseMap

庫,它是在

mpl_toolkits

下的Matplotlib工具庫之一。相比於現在常用的其它繪圖工具,如leaflet, Google Maps API, BaseMap略顯笨重,但在Python中,它還是非常有效的地圖繪製工具,本章我們將講解下如果用BaseMap進行地理影象的繪製。

BaseMap安裝比較簡單,可以透過conda直接安裝或者下載按照,如果安裝過程中出現一些問題,可參照我另一篇文章《Basemap報錯KeyError: ‘PROJ_LIB’》尋找解決辦法。

$ conda install basemap

該模組的標準引用:

%matplotlib inlineimport numpy as npimport matplotlib。pyplot as pltfrom mpl_toolkits。basemap import Basemap

工具庫新增後便可以開始地圖的繪製,如繪製一個地球表面影象:

plt。figure(figsize = (8,8))m = Basemap(projection = ‘ortho’,resolution = None, lat_0=50, lon_0 = -100)m。bluemarble(scale=0。5)

Python資料科學之視覺化-BaseMap繪製地理影象

A “bluemarble” projection of the Earth

裡面引數的含義我們稍後討論。

在BaseMap中,繪製出的影象不僅僅是一個圖片,它是帶有地理座標的,這意味著我們可以在影象上作資料標註。例如我們可以繪製出一張北美的地圖,然後在上面標註出西雅圖(Seattle)的位置。此處我們選擇一種

etopo

的影象(含陸地和海洋背景的一種影象)。

fig = plt。figure(figsize=(8, 8)) m = Basemap(projection=‘lcc’, resolution=None, width=8E6, height=8E6, lat_0=45, lon_0=-100,) m。etopo(scale=0。5, alpha=0。5) # 經緯度輸入 (long, lat) to (x, y) x, y = m(-122。3, 47。6) plt。plot(x, y, ‘ok’, markersize=5) plt。text(x, y, ‘ Seattle’, fontsize=12);

Python資料科學之視覺化-BaseMap繪製地理影象

地圖標註影象

此處僅給出了地理視覺化的兩個簡單示例,簡單幾行程式碼,可實現地圖的視覺化繪製,下面我們深入介紹下BaseMap庫,透過下面幾個例子,你將能夠學會如何建立你想要的地理影象。

選擇Map Projection

繪製圖像第一件事是選擇採用哪種projection,我們都知道無法在一個平面上畫出一個球形圖,如果不對這個球形進行展開,在人類的歷史上,已經有發展出一些為人熟知的地理影象,這些通常就是一個個的projection。取決於我們使用地圖的目的,我們有大量的projection去選擇,此處我選擇幾個常見的進行介紹,我們首先定義一個繪製世界地圖的函式:

from itertools import chaindef draw_map(m, scale=0。2): # 畫一個地貌圖 m。shadedrelief(scale=scale) # 建立經緯度字典 lats = m。drawparallels(np。linspace(-90, 90, 13)) lons = m。drawmeridians(np。linspace(-180, 180, 13)) # keys contain the plt。Line2D instances 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) # cycle through these lines and set the desired style for line in all_lines: line。set(linestyle=‘-’, alpha=0。3, color=‘w’)

Cylindrical projections

Cylindrical projections幾乎是最簡單的projection,經緯度分別繪製成橫線和垂直線,這種圖形對於赤道附近的地區表現形式非常好,但對應極點附近的區域,表現就極端扭曲,因為緯線間的空間距離在不同的緯度上是不同的,所以扭曲程度也是不同的。下面是cylindrical projection的一個示例,我們選擇等距的cylindrical projections(projection=‘cyl’)),其它還有“merc”和“cea”,可自行嘗試。

fig = plt。figure(figsize=(8, 6), edgecolor=‘w’) m = Basemap(projection=‘cyl’, resolution=None,draw_map(m)

Python資料科學之視覺化-BaseMap繪製地理影象

Cylindrical equal-area projection

Pseudo-cylindrical projections

Pseudo-cylindrical projections解決了上圖在極點附近影象扭曲的現象,僅在赤道附近緯線是垂直的。Mollweide projection (projection=‘moll’)是常用的一種,它可以是幾點附件的影象顯示與實際一致的面積大小。其它的有Pseudo-cylindrical projections還有sinusoidal (projection=‘sinu’) 和 Robinson (projection=‘robin’) 。

fig = plt。figure(figsize=(8, 6), edgecolor=‘w’) m = Basemap(projection=‘moll’, resolution=None, lat_0=0, lon_0=0)draw_map(m)

Python資料科學之視覺化-BaseMap繪製地理影象

The Molleweide projection

Perspective projections

Perspective projections是為了檢視某一特定視角而採用的一種方式,如同你想在空間的某個視角拍攝地球。常用的一種是orthographic projection (projection=‘ortho’),它顯示的是地球的一面,其它的有gnomonic (projection=‘gnom’) 和 stereographic (projection=‘stere’)。

fig = plt。figure(figsize=(8, 8)) m = Basemap(projection=‘ortho’, resolution=None, lat_0=50, lon_0=0) draw_map(m);

Python資料科學之視覺化-BaseMap繪製地理影象

The orthographic projection

Conic projections

Conic projections展示的是一個圓錐形,它能非常好地展示區域性特徵,但越遠離圓錐,影象扭曲會越嚴重。Lambert conformal conic projection (projection=‘lcc’),這個是我們開篇用到的繪製北美的projection,其它的有equidistant conic (projection=‘eqdc’) 和 Albers equal-area (pro jection=‘aea’)。

fig = plt。figure(figsize=(8, 8)) m = Basemap(projection=‘lcc’, resolution=None, lon_0=0, lat_0=50, lat_1=45, lat_2=55, width=1。6E7, height=1。2E7)draw_map(m)

Python資料科學之視覺化-BaseMap繪製地理影象

The Albers equal-area projection

其它projections

如果你想做地圖視覺化相關的工作,強烈建議你詳細瞭解各種projections,包括它們的特性,優缺點等。更多內容,可以讀下

BaseMap package

的官方文件,連結:http://matplotlib。org/basemap/users/mapsetup。html。

參考內容:《Python Data Science Handbook》by Jake VanderPlas

如果你想學習資料分析而沒有思路,沒有資源,私信我或關注“資料科學與商業實踐”,陳述你的問題,看到後會給出答覆。