今天闲来无事,看到我国的人口屡创新创,准备使用R语言做个分析,把各省的出生率画个热力图出来,结果呢遇到很多雷,再次借CSDN的平台,把这一切记录一下,为各位看官排忧。闲话省说,先上效果图
首先一点,R语言做热力图想要最炫的效果得使用REmap这个包,不过这个包不是R语言官方CRAN上带的,一般从网上查到的资料都是说要用这种安装方法装
library(devtools)#当然如果你没有装devtools这个包,需要使用install.packages("devtools")命令先去安装包。
install_github('lchiffon/REmap')
不过这个方法装不上REmap,会报这个错误:
Error in read.dcf(path) :
Found continuation line starting ' interactive map ...' at begin of record.
这个错误其实是作者在描述包的文件中多了几个空格造成的。所以遇到这个情况呢,请你去我的资源页中下载一个修复版https://download.csdn.net/download/beyondma/10886472,当然你也可以自己到github上去下载包,然后解压后自行修复description文件也行。在拿到修复包之后通过本地安装即可。具体代码如下:
devtools::install_local("D://geo_data//REmap-master.zip")#把下载的包的路径写在这里
Installing 3 packages: htmltools, rjson, XML
试开URL’https://cloud.r-project.org/bin/windows/contrib/3.5/htmltools_0.3.6.zip'
Content type 'application/zip' length 661050 bytes (645 KB)
downloaded 645 KB
试开URL’https://cloud.r-project.org/bin/windows/contrib/3.5/rjson_0.2.20.zip'
Content type 'application/zip' length 577829 bytes (564 KB)
downloaded 564 KB
试开URL’https://cloud.r-project.org/bin/windows/contrib/3.5/XML_3.98-1.16.zip'
Content type 'application/zip' length 4600112 bytes (4.4 MB)
downloaded 4.4 MB
package ‘htmltools’ successfully unpacked and MD5 sums checked
package ‘rjson’ successfully unpacked and MD5 sums checked
package ‘XML’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
D:\QQPCmgr\Temp\Rtmp8IVdOE\downloaded_packages
* installing *source* package 'REmap' ...
** R
** data
*** moving datasets to lazyload DB
** demo
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package 'REmap'
finding HTML links ... 好了
REmapOutput html
get_city_coord html
get_geo_position html
get_theme html
knitrREmap html
mapNames html
markLineControl html
markPointControl html
plot.remap html
remap html
remap.init html
remapB html
remapC html
remapH html
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (REmap)
In R CMD INSTALL
> library("REmap")
好的,当成功加载了REmap包之后你就可以去用他做热力图了。
下面这张表读者可以自行考到excel文件中去,这是17年全国人口出生率的数据。
山东 | 17.54 |
西藏 | 16 |
新疆 | 15.88 |
广西 | 15.14 |
福建 | 15 |
海南 | 14.73 |
青海 | 14.42 |
安徽 | 14.07 |
贵州 | 13.98 |
江西 | 13.79 |
广东 | 13.68 |
云南 | 13.53 |
宁夏 | 13.44 |
湖南 | 13.27 |
河北 | 13.2 |
河南 | 12.95 |
湖北 | 12.6 |
甘肃 | 12.54 |
浙江 | 11.92 |
四川 | 11.26 |
重庆 | 11.18 |
陕西 | 11.11 |
山西 | 11.06 |
江苏 | 9.71 |
内蒙古 | 9.47 |
北京 | 9.06 |
上海 | 8.1 |
天津 | 7.65 |
吉林 | 6.76 |
辽宁 | 6.49 |
黑龙江 | 6.22 |
生成热力图具体代码如下:
orgdata=read_excel("D://birth1.xls",col_names=F)
orgdata=data.frame(province=orgdata[[1]],birthrate=orgdata[[2]])
mydata=data.frame(get_geo_position(as.character(orgdata[[1]])),orgdata[[2]])
mydata=mydata[,-3]
names(mydata) <- c("lon","lat","cityvalue")
remapH(mydata, maptype = 'china', theme = get_theme("Dark"), blurSize = 30, color = 'red', minAlpha = 0.5, opacity = 1)
但是你看到这样的效果不好,原因很简单,以西藏为例,西藏的出生率排名第二,却比较暗淡,这是因为我们的mapdata中只有西藏首俯拉萨一个点的数据,这画出来自然没有效果。至少要把一个省的所有城市都标上相同的效果出来才好,改进如下:
orgdata=read_excel("D://birth1.xls",col_names=F)#需要填写你excel文的路径
orgdata=data.frame(province=orgdata[[1]],birthrate=orgdata[[2]])#重新定义列名mydata=data.frame(get_geo_position(as.character(orgdata[[1]])),orgdata[[2]])#通过get_geo_position函数得到每个省的坐标
mydata=mydata[,-3]#把第三列也就是省份名称去掉,绘图时不需要此列
names(mydata) <- c("lon","lat","cityvalue")#改列名,后面否则无法添加行
provnames=as.character(orgdata[[1]])#将省份名称取出来
for (j in 1:length()){
citynames=mapNames(provnames[j])#从省份中将城市名称取出来,否则将画出来的热力图效果太差
citypos=get_geo_position(citynames)#将同省内的城市标为和省同样的数据
cityvalue=rep(c(orgdata[j,2]),length(citynames))#将同省内的城市标为和省同样的数据
orgcity=data.frame(citypos,cityvalue)#将同省内的城市标为和省同样的数据
orgcity=orgcity[,-3]#将同省内的城市标为和省同样的数据
mydata=rbind(mydata,orgcity)#将同省内的城市标为和省同样的数据
}
remapH(mydata, maptype = 'china', theme = get_theme("Dark"), blurSize = 30, color = 'red', minAlpha = 0.5, opacity = 1)#绘图
效果是这样的
这样是不是就准确多了。
当然也可以直接用REmapC做一个没那么纯一点的热力图代码如下
outdata = remapC(orgdata,maptype = "china",color = 'red',mindata=6,maxdata=17.8)
plot(outdata)
文中开头的效果图其实是最简单的代码如下:
map_out1<- remap(mapdata=map_data)
好了,到这里所有坑全排了,祝大家新年快乐!