前言说明
对于地域信息的描述,采用地图的形式展现会比语言描述或者一般的条形图、饼图更直观,近期需要展现不同地区数据差别,可以借鉴一些网站例如地图惠等导入数据制作,但很多都有一定限制,例如注册收费等,故利用R进行了绘制。参考openthings的博客成功制作出了漂亮的地图,他的博客写的很详细,很赞。
首先下载地图文件及其他用到的数据,解压保存到自己指定的文件夹中,绘图所用到的数据均在该文件中。
R代码实现
##加载相关包
library(mapdata)
library(maptools)
library(ggplot2)
library(plyr)
读取地图文件,并绘制出图形
china_map=readShapePoly("E://study_data//chinaprovinceborderdata_tar_gz//bou2_4p.shp")
plot(china_map)
效果如图,由于投影结果过于扁平,故需要调整。
ggplot(china_map,aes(x=long,y=lat,group=group))+
geom_polygon(fill="white",colour="black")+
coord_map("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)
)
调整投影方式后,图像如下,可以不要theme部分,自己查看效果,会有经纬线等信息。
x<-china_map@data
xs<-data.frame(x,id=seq(0:924)-1)#地图中共计有925个地域信息
china_map1<-fortify(china_map)
china_map_data<-join(china_map1,xs,type="full")#基于id进行连接
#unique(china_map@data$NAME)#查看地图数据中保存的地域名称,编辑自己的数据与其一致
mydata<-read.csv("E://study_data//data_dt.csv",header=T,as.is=T)
china_data <- join(china_map_data, mydata, type="full")#基于NAME字段进行连接,NAME字段来自于地图文件中
上述代码将地图数据与自己的数据进行连接,合并在一起,进一步绘制符合自己要求的热力图。
ggplot(china_data,aes(x=long,y=lat,group=group,fill=ratio))+
geom_polygon(colour="grey40")+
scale_fill_gradient(low="white",high="red")+
coord_map("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)
)##参数“ratio”为我们要展现的数据指标,基于该指标绘制热力图
图形结果如下,是不是有那么一丢丢好看,颜色可自己调整,这里我选用的红色。
下面加上地区标签。
province_city<-read.csv("E://study_data//pcity.csv",header=T,as.is=T)#获取省会城市坐标
ggplot(china_data,aes(long,lat))+
geom_polygon(aes(group=group,fill=ratio),colour="grey",size=0.01)+
scale_fill_gradient(low="white",high="red")+
coord_map("polyconic")+
geom_text(aes(x=jd,y=wd,label=name),data=province_city,colour="black",size=2.5)+
theme(
panel.grid=element_blank(),
panel.background=element_blank(),
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank()
)
边缘色为黑色个人觉得不好看很丑,调整为grey,最终成果图如下。