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不同,矩阵合并时出现了问题,这个地方暂时还没解决,先留着。

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