Python matplot工具包之一的 mpl_toolkits繪制屬于你的世界地圖
Python之是以這麼流行,是因為它不僅能夠應用于科技領域,還能用來做許多其他學科的研究工具,繪制地圖便是其功能之一。
今天我們用matplot工具包之一的 mpl_toolkits 來繪制世界地圖,這是一個簡單的可視化工具,如果希望繪制更加複雜的地圖,可以考慮使用Google Maps API,不過這不在我們今天的讨論範圍之内。
1.準備
開始之前,你要確定Python和pip已經成功安裝在電腦上。
**(可選1) **如果你用Python的目的是資料分析,可以直接安裝Anaconda,它内置了Python和pip.
**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優點。
請選擇以下任一種方式輸入指令安裝依賴 :
- Windows 環境 打開 Cmd (開始-運作-CMD)。
- MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
- 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install numpy
pip install matplotlib
為了使用 mpl_toolkits, 單純安裝matplotlib是不夠的,我們還需要單獨安裝basemap,如果你已經安裝了Anaconda,那這一步就非常好辦,輸入以下指令安裝即可:
conda install basemap
如果沒有的話,就稍微麻煩一點:
1.安裝geos: pip install geos
2.根據你的Python版本下載下傳basemap
http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap 注意cp後面的數字是Python的版本。(在頁面上按ctrl+F,輸入basemap快速定位)
3.在 cmd 下進入該檔案的目錄,運作
pip install basemap‑1.2.1‑cp37‑cp37m‑win_amd64.whl
2.簡單的地圖
讓我們開始繪制一個地球,中心指向中國:
#繪制一個地球
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
#初始化圖形
plt.figure(figsize=(8,8))
#底圖:圓形 ,lat_0:緯度:log_o:經度,(113,29)是武漢
m=Basemap(projection='ortho',resolution=None,lat_0=29,lon_0=113)
#底色
m.bluemarble(scale=0.5)
#顯示
plt.show()
效果還不錯哦,不僅如此,它其實不單單隻是一張圖像,它還是一個功能齊全的matplot畫布。這也就意味着,你能夠在上面畫線!讓我們放大地圖,進入中國區域,然後标記出深圳的位置:
不要用藍底圖了,看得不是很清晰,我們換成浮雕型:#導入需要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
#以下三行是為了讓matplot能顯示中文
from pylab import mpl
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
fig=plt.figure(figsize=(8,8))
#注意幾個新增的參數,width和height是用來控制放大尺度的
#分别代表投影的寬帶和高度(8E6 代表,8x10^6米
m=Basemap(projection='lcc',resolution=None,width=8E6,height=8E6,lat_0=23,lon_0=113,)
m.etopo(scale=0.5)
#這裡的經緯度:(經度,緯度)
x,y=m(113,23)
plt.plot(x,y,'ok',markersize=5)
plt.text(x,y,'深圳',fontsize=12,color="red")
plt.show()
可以很明顯地看到山區、丘陵等地理樣貌。你還可以根據你的需要,針對某幾個城市做連線或者繪制某些經緯度之間的區域。别忘了,這可是matplotlib可編輯的畫布。
3.世界地圖
接下來,我們将上述的世界地圖展開成帶經緯線的平面圖形。
#導入需要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from itertools import chain
def draw_map(m,scale=0.2):
#繪制帶陰影的浮雕圖像
m.shadedrelief(scale=scale)
#根據經緯度切割,每13度一條線
lats=m.drawparallels(np.linspace(-90,90,13))
lons=m.drawmeridians(np.linspace(-180,180,13))
#集合所有線條
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='-',alpha=0.3,color='w')
fig=plt.figure(figsize=(8,6),edgecolor='w')
m=Basemap(projection='cyl',resolution=None,
llcrnrlat=-90,urcrnrlat=90,
llcrnrlon=-180,urcrnrlon=180,)
draw_map(m)
plt.show()
設定地圖上面的景點: