1. 程式人生 > >麋鹿分佈圖製作(二)—— 用Python和R在地圖上打點

麋鹿分佈圖製作(二)—— 用Python和R在地圖上打點

上期用Python呼叫百度API得到地點的經緯度, 今天就將這些點標註在地圖上。
首先我們用R語言來標註。
文中用到的檔案已上傳到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

畫出的地圖如下:
r的地圖

接下來用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()

python做的地圖

在這裡需要注意的是,這個程式碼無論是在Jupyter notebook還是在sublime text 3中執行都是會報錯的,但是在jupyter notebook中是可以跑出地圖來的,如上圖。

在兩個程式之中跑的程式碼,我們可以看到,有些點的位置是不準確的,我不知道這是由於百度地圖API給的經緯度不夠準確還是我下載的shp檔案和百度地圖不太相容,如果我以後找到原因會更新本文。



作者保留權利。文章為作者獨立觀點,不代表資料人網立場。嚴禁修改,轉載請註明原文連結:http://shujuren.org/article/775.html
資料人網:資料人學習,交流和分享的平臺,誠邀您創造和分享資料知識,共建和共享資料智庫。