R語言:數據地圖

數據地圖是一種經典的圖示方法,在R軟件中,各種程序包所提供的函數在繪製數據地圖時比較方便。

基本地圖的繪製

世界地圖

方法一
R包中存儲着常見地圖的數據,比如maps包中包含世界地圖、美國地圖等

library(maps)
map("world", fill = TRUE, col = rainbow(200),
    ylim = c(-60, 90), mar = c(0, 0, 0, 0))
title("世界地圖")

在這裏插入圖片描述
方法二

library(maps)
data("world.cities")
bigcities <- subset(world.cities, pop > 5000000)
qplot(long, lat, data = bigcities,colour=country.etc,size=pop)+ borders("world", size= 0.5)

在這裏插入圖片描述

中國地圖

利用ggplot2繪製美國地圖比較容易,因爲美國地圖是程序包maps中自帶的地圖,但其他國家的地圖數據則需要從外部導入。

方法一
首先,安裝相應的包

install.packages("mapproj")
install.packages(“sp”)
install.packages(“maptools”)
library(maptools)
library(ggplot2)
library(plyr)
library(sp)

下載中國地圖的GIS數據
這是一個壓縮包,完全解壓後一般包含三個文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),將這三個文件解壓到R的工作空間下,或者直接輸入路徑:

x <- readShapePoly("C:/Users/SAMSUNG/Desktop/china-province-border-data/bou2_4p.shp")
plot(x)

如果安裝maptools後無法用readShapePoly()函數讀取.shp文件,可以試試rgdal程序包,然後用rgdal包中的readOGR()函數讀取.shp文件:

library(rgdal)
china_map <- readOGR("C:/Users/SAMSUNG/Desktop/china-province-border-data/bou2_4p.shp")
china_map1 <- fortify(china_map)
#繪製全國地圖-不着色
ggplot(china_map1,aes(x=long,y=lat,group=group))+
   geom_polygon(fill="white",colour="black")+
   coord_map("polyconic")
   china_map_data<-join(china_map1, xs, type = "full")
   
#繪製全國地圖-分省着色
ggplot(china_map_data, aes(x = long, y = lat))+
  geom_polygon(aes(group = group,fill=NAME),color="grey40" )+ #線條色
  coord_map("polyconic")+
  scale_fill_manual(values=colours(),guide=FALSE) #分省着色

在這裏插入圖片描述

方法二
從gadm.org網站上得到中國的省區地理數據,並加載到R軟件內存中。GADM是世界行政區域(或行政區域界線)位置的空間數據庫,可專門用於地理信息系統和類似的軟件,並且提供Rdata格式的數據,非常便於在R中繪製數據地圖。
但是。。。你會發現一些令人氣憤的事,如下圖【筆者已經無fuck說了
在這裏插入圖片描述
代碼如下,可自己補全路徑

install.packages(“sp”) 
library(sp)  
load(url("http://gadm.org/.../***.RData"))
#將每個省人口數據按順序存放在數據框gadm中,生成一個變量pop
gadm$pop=c(1961,1293,7185,3571,2470,4374,2745,3831,2301,7866,5442,
           5950,3689,4456,9579,9402,5723,6570,10432,4602,867,2884,
           8041,3474,4596,300,3732,2557,562,630,2181,706)
#利用空間繪圖命令進行繪圖
spplot(gadm,"pop",col.regions = rev(terrain.colors(gadm$pop)),main="中國各省人口數據")

方法三

library(mapdata)
ch_cities <- subset(world.cities, country.etc=="China")
ggplot(ch_cities, aes(long, lat)) + geom_point(colour= alpha("red",0.5))+ borders("china")

在這裏插入圖片描述
方法四

map("china", col = "red4", ylim = c(18, 54), panel.first = grid())

在這裏插入圖片描述

實例一:NBA球隊

NBA比賽球隊30支,現想了解詹姆斯(LBJ)對陣哪個球隊時表現更好,或得分更高,故通過繪製數據地圖直觀地得到結論。

library(ggplot2)
lbj=read.table("C:/Users/SAMSUNG/Desktop/R數據分析/data/lbj.txt",header=T,quote="'") 

attach(lbj)
head(lbj)  #查看數據集的前5行
state_map=map_data("state")  #獲取美國地圖的數據信息

p=ggplot(lbj,aes(map_id=state))+geom_map(aes(fill=AvgPTS),map=state_map)+
  expand_limits(x=state_map$long,y=state_map$lat)+
  scale_fill_continuous(limits=c(19,max(AvgPTS)),high='red3',low='yellow',guide="colorbar")+
  options(title='詹姆斯客場平均得分')

attach(state_map)
state.uni=unique(region)  #存放各州的名稱
xx=0;yy=0  #事先建立變量xx和yy,下面用循環找到每個州對應的座標值
for(i in 1:length(state.uni))
{
  xx[i]=mean(long[region==state.uni[i]])
  yy[i]=mean(lat[region==state.uni[i]])
}

order=0  #按變量state.uni的順序找到數據集lbj中各州的位置,存放於變量order
for(i in 1:length(state.uni)){
  order[i]=which(state==state.uni[i])
}
labels=Opp[order]  #通過位置找到各州對應的球隊名稱
p+annotate("text",x=xx,y=yy,label=labels)  #最後繪圖並添加註釋

運行結果如下:
在這裏插入圖片描述
區域顏色越深,表示詹姆斯在該球隊所得的分數越高。
用ggplot2畫美國地圖是相當的方便。

實例二:新冠肺炎

方法一
數據是截至2020年2月28日00:00,各省份的累計確診病例數

library(sp)
library(maptools);
x=readShapePoly('.../bou2_4p.shp');
getColor=function(mapdata,provname,provcol,othercol)
{
f=function(x,y) ifelse(x %in% y,which(y==x),0);
colIndex=sapply(mapdata$NAME,f,provname);
fg=c(othercol,provcol)[colIndex+1];
return(fg);
#mapdata 存放地圖數據的變量x
#provname 需要改變顏色的地區的名稱
#provcol 對應於provname的代表顏色的向量(名稱或數字)
#othercol 是其它地區的顏色
}
provname=c("北京市","天津市","河北省","山西省","內蒙古自治區",
"遼寧省","吉林省","黑龍江省","上海市","江蘇省",
"浙江省","安徽省","福建省","江西省","山東省",
"河南省","湖北省","湖南省","廣東省",
"廣西壯族自治區","海南省","重慶市","四川省","貴州省",
"雲南省","西藏自治區","陝西省","甘肅省","青海省",
"寧夏回族自治區","新疆維吾爾自治區","臺灣省",
"香港特別行政區");
pop=c(410,136,318,133,75,121,93,480,337,631,1205,990,296,935,756,1272,65914,1017,1348,252,168,
576,538,146,174,1,245,91,18,72,76,32,93);
provcol=grey((1-pop/max(pop)))
plot(x,col=getColor(x,provname,provcol,"white"),xlab="",ylab="");

顏色數據部分運行如下:
在這裏插入圖片描述
方法二
將csv文件中的省份數據和程序包中所給的地圖數據作矩陣合併

data<-read.csv("C:/Users/SAMSUNG/Desktop/data.csv",T) #讀取人口數據
names(data)
china_data <- join(china_map_data, data, type="full") #矩陣合併
names(china_data)

ggplot(data,aes(x=long,y=lat,id=id,fill=number))+ #以人口數填充色彩
  geom_polygon(colour="grey40")+ #省界顏色
  scale_fill_gradient(low="white",high="steelblue")+#指定漸變填充色
  coord_map("polyconic")+#指定投影方式爲polyconic
  theme(               #清除不需要的元素
    panel.grid = element_blank(),
    panel.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    axis.title = element_blank(),
    legend.position = c(0.2,0.3)
  )

可能是因爲GADM提供的id不同,矩陣合併時出現了問題,這個地方暫時還沒解決,先留着。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章