麋鹿分佈圖製作(二)—— 用Python和R在地圖上打點
上期用Python呼叫百度API得到地點的經緯度, 今天就將這些點標註在地圖上。 首先我們用R語言來標註。 文中用到的檔案已上傳到 ofollow,noindex" target="_blank">Github 。
library(rgdal) library(ggplot2) library(mapproj) library(xlsx) # 設定一下工作路徑 setwd('D:/class/zonglv') # 讀取檔案 milu = read.xlsx('milu.xlsx', 1, encoding = 'UTF-8') # 讀取中國地圖 china_map <- readOGR('./mapdata/bou2_4p.shp') # 轉化為資料框 china_map <- fortify(china_map) p = ggplot() + geom_polygon(data=china_map, aes(x=long, y=lat, group = group), colour="grey60", size = 0.25) + geom_point(data = milu, aes(x = lon,y = lat, color = time, shape = species), size = 1.5) + coord_map("polyconic") p
畫出的地圖如下:
接下來用python的basemap畫一次。
import time from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt from matplotlib.patches import Polygon import pandas as pd import numpy as np
在這些呼叫的模組中,basemap的安裝可能會難一點,這裡請參考 Basemap手冊 ,另外, Basemap tutorial 也不錯,參考這兩個連結應該就可以畫很多圖了,但是我在跑Basemap的時候很多關鍵的程式碼都會出現Can't set attribute的報錯,目前還沒有找到原因,勉強跑了一個圖出來,如果有大神看到這個帖,麻煩告知一下解決方法。
ml = pd.read_excel('milu.xlsx') # 我們還是先把資料讀入進來 plt.figure(figsize = (16,8)) m = Basemap(llcrnrlon=77,llcrnrlat=14,urcrnrlon=140,urcrnrlat=51,projection='lcc',lat_1=33,lat_2=45,lon_0=100) m.drawcoastlines() m.drawcountries(linewidth=1.5) m.readshapefile('shapefile/gadm36_CHN_1', 'states', drawbounds=True) lats = list(ml['lat']) lons = list(ml['lon']) x, y = m(lons, lats) m.scattter(x,y,3,marker = 'o', color = 'red') plt.show()
在這裡需要注意的是,這個程式碼無論是在Jupyter notebook還是在sublime text 3中執行都是會報錯的,但是在jupyter notebook中是可以跑出地圖來的,如上圖。
在兩個程式之中跑的程式碼,我們可以看到,有些點的位置是不準確的,我不知道這是由於百度地圖API給的經緯度不夠準確還是我下載的shp檔案和百度地圖不太相容,如果我以後找到原因會更新本文。
版權宣告: 作者保留權利。文章為作者獨立觀點,不代表資料人網立場。嚴禁修改,轉載請註明原文連結:http://shujuren.org/article/775.html
資料人網: 資料人學習,交流和分享的平臺,誠邀您創造和分享資料知識,共建和共享資料智庫。