數據地圖是一種經典的圖示方法,在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不同,矩陣合併時出現了問題,這個地方暫時還沒解決,先留着。