R(四): R开发实例-map分布图
前几章对R语言的运行原理、基本语法、数据类型、环境部署等基础知识作了简单介绍,本节将结合具体案例进行验证测试。 案例场景:从互联网下载全国三甲医院数据,以地图作为背景,展现各医院在地图上的分布图。全国三甲医院数据来源 http://www.wxmp.cn/cms/detail-51610-23480-1.html
目录:
- map包研究
- 效果图
- 数据清洗
- R开发
- R脚本部署
map包研究:
- CRAN上地图的一个常用包就是maps (https://cran.r-project.org/web/packages/maps/index.html), 它里边一个基本的函数是map( ).
- 示例: map('world', fill = TRUE,col=colors( )) , 你在Rstudio执行语句得出的结果可看出这个包用的数据集够老了,苏联还在,画中国地图,还需要用到 mapdata 包(http://cran.r-project.org/web/packages/mapdata/index.html) 这是maps的补充包,给了更高清晰度或更大的数据集。里边提供了中国和日本地图。 但是这个地图数据更老,没有重庆市,直接 Pass。
- ggmap包是基于ggplot2的图层语法构建的R包,ggplot2作为R的图形系统,其最鲜明的特点在于其分层语法,即把图像元素一层层叠加在基础画布之上。事实上,一张主题地图就相当把地图作为画布,而把基于地理的信息表现在地图上。如果作为基础画布的地图和ggplot2的分层语法结合起来,那么就能更高效绘制主题地图。这个结合的工作就是由ggmap包来实现的
- ggmap 它结合了来自Google Maps,OpenStreet Map,Stamen Maps和CloudMade Maps的静态地图信息来绘制主题地图,但遗憾的是国内无法访问google map, 只能 pass
- REmap 是一个基于Echarts2.0 的一个R包.主要的目的是为广大数据玩家提供一个简便的,可交互的地图数据可视化工具,在此基础上,稍作修改,基本可用,但存在一个问题就是 Echart2.0 在移动终端上无法自适应
效果图:
数据清洗:
- 完成本节验证,需要用到 github 上的两个软件包, baidumap (清洗数据时根据医院名称获取经纬度) REmap (可视化展现),安装命令如下
- R命令: install.packages("devtools")
- R命令: library(devtools)
- R命令: install_github('badbye/baidumap')
- R命令: install_github('lchiffon/REmap')
- 从网上抓取的数据整理后保存至一个txt文件 (数据来源 http://www.wxmp.cn/cms/detail-51610-23480-1.html)
- 加载baidumap包,获取医院的经纬度,再对数据进行清洗,将结果保存至本地的文件
- window Rstudio环境,代码如下(纠正一下,write.table 里面的参数增加 sep="\t":
#读取数,删除空值
pdata<-read.csv("d:\\data.txt",sep="\t",header=FALSE,col.names = c("city","name"))
pdata <- na.omit(pdata) #加载baidumap 根据名称获取医院经纬度
library(baidumap)
bhs <- getCoordinate(pdata$name,formatted = T) #组织清洗后的数据
hsdata <- data.frame(name=rownames(bhs),lon=bhs[,1],lat=bhs[,2])
result <- merge(pdata,hsdata,by.x="name",by.y="name")
head(result) #删除空值数据
result <- na.omit(result) #保存清空后的数据
path <- c("d:\\data1.txt")
write.table(result,file = path,row.names = FALSE) 清理前后的数据对比图如下:
R包开发:
- REmap的问题,在show()的时候,直接起了一个R Session, 调用浏览器show出了最终的结果,如若最终的产品要集成在我们自己的Web框架内或者一个网页内嵌的IFrame里,这样就玩不转,因此在REmap的基础上稍作修改,将生成的结果保存在 linux httpd服务对应的站目录,文件生成后,返回client 文件名,由client发起二次请求加载网页。
- 示列代码如下(发布到linux系统),保存命名为 CMap.R:
#FastRWeb调用R脚本函数入口
run <- function(...){ #物理文件保存地址
path = c("/var/www/html")
file_name = paste0("C", format(Sys.time(), "%Y%m%d"))
full_path = paste0(path, "/", file_name, ".html")
if (file.exists(full_path)) {
out(file_name)
return
} my.writeMap(full_path)
out(file_name)
} my.writeMap <- function(file_name){ #获取清洗完成的数据
pdata<-read.csv("/var/www/html/data1.txt",sep="\t",header=FALSE,col.names = c("name","cityName","lon","lat"))
head(pdata) #按城市统计医院数量(分布图用到的参数)
cityCount <- tapply(pdata$name,pdata$cityName,length)
citydata <- data.frame(place=row.names(cityCount),values=cityCount) #geodata
stadata <- data.frame(lon=pdata$lon,lat=pdata$lat,cityname = pdata$name) #分布图
library(REmap)
output <- remapC(citydata,
title = "Demo",
theme = get_theme("Bright"),
markPointData =stadata[,3],
markPointTheme = markPointControl(symbol = "pin",effect = TRUE,symbolSize = 3,color = "red"),
geoData = stadata) my.plot(output,file_name)
} #写物理文件,修改REmap 代码
my.plot <- function(object, file_name) { ## SVG rewrite JS path
if (object@maptype == 'SVG') {
content <- sub("http://echarts.baidu.com/build/dist/echarts.js","./js/echarts.js", object@content)
content <- sub("http://echarts.baidu.com/build/dist/echarts-all.js","./js/echarts-all.js",content)
} if (object@maptype == 'SVGH') {
content <- sub("http://echarts.baidu.com/build/dist/echarts.js","./js/echarts.js", object@content)
content <- sub("http://echarts.baidu.com/build/dist/echarts-all.js","./js/echarts-all.js",content)
} ## Bmap rewrite JS path
if (object@maptype == "Bmap") {
content <- sub("http://echarts.baidu.com/build/dist/echarts.js","./js/echarts.js",object@content)
content <- sub("http://echarts.baidu.com/doc/asset/js/jquery.min.js","./js/jquery.min.js",content)
content <- sub("http://lchiffon.github.io/reveal_slidify/echarts/require", "./js",content)
}
writeLines(content,file_name,useBytes = T)
} - 说明: 本例代码是发布到FastRWeb框架上通过程序调用以Web方式访问的示例,如果仅是学习研究用的话,直接将 my.writeMap 函数里面的代码 copy 出来,将最后一句保存物理文件的代码改为 show(output)或 output,在你本地Window的Rstudio 命令行下执行即可看到效果, 没那么麻烦。
R脚本部署:
- 将清洗后的数据文件(data.txt)和R脚本文件(CMap.R) copy至linux主机的 /var/FastRWeb/web.R 目录下
- 通过程序(开发语言不限)访问 http://192.168.0.10:8888/CMap,得到名为 CYYYYMMDD.html 的文件名
- 通过程序再次发起请求:http://192.168.0.10/CYYYYMMDD.html 即可得到上所示效果图
R(四): R开发实例-map分布图的更多相关文章
- R(七): R开发实例-map热力图
第四章通过REmap包完成基于map分布图示例,前面提到REmap基于Echart2.0, 一方面在移动终端适应效果差,另一方面REmap提供的热力图仅支持全国及省市大版块map,基于上面的原因,参考 ...
- 工业级GBDT算法︱微软开源 的LightGBM(R包正在开发....)
看完一篇介绍文章后,第一个直觉就是这算法已经配得上工业级属性.日前看到微软已经公开了这一算法,而且已经发开python版本,本人觉得等hadoop+Spark这些平台配齐之后,就可以大规模宣传啦~如果 ...
- 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口
HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...
- Android音乐播放器的开发实例
本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的 ...
- Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
本博前面的文章介绍了Android开发环境的搭建和模拟器的常用操作.本次,将以Android Sample中经典的SoftKeyboard项目为例,详细解析Android上一个小型项目的开发过程和注意 ...
- [转贴]JAVA:RESTLET开发实例(二)使用Component、Application的REST服务
上一篇文章,我们介绍了基于JAX-RS的REST服务,本篇文章我们介绍不基于JAX-RS的模式.JAX-RS其实就是一个简单的 Application服务.和我们接下来介绍的Application基本 ...
- 使用eclipse搭建第一个python+Django的web开发实例
python+Django的web开发实例 一.创建一个项目如果这是你第一次使用Django,那么你必须进行一些初始设置.也就是通过自动生成代码来建立一个Django项目--一个Django项目的 ...
- Android开发实例之miniTwitter登录界面的实现
原文: http://www.jizhuomi.com/android/example/134.html 本文要演示的Android开发实例是如何完成一个Android中的miniTwitter登录界 ...
- Android高手速成--第四部分 开发工具及测试工具
第四部分 开发工具及测试工具 主要介绍和Android开发工具和测试工具相关的开源项目. 一.开发效率工具 Json2Java根据JSon数据自动生成对应的Java实体类,还支持Parcel.Gson ...
随机推荐
- nginx模块_使用gdb调试nginx源码
工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里 ...
- opencv3.1包安装
由于之前零零碎碎安装了很多必要的库: 现在只需: (1)下载和解压包 https://github.com/daveselinger/opencv/tree/3.1.0-with-cuda8 这里的分 ...
- 重装系统后删除Cygwin文件夹
1.右键点要删除Cygwin 文件夹,依次选属性-安全-高级-所有者-编辑,将所有者改为你的登录帐户,勾选下方“替换子容器和对象的所有者”. 2.在 属性-安全-高级对话框中选 权限选项卡,点更改权限 ...
- linux查看系统的启动时间和运行时间
1. uptime命令 输出:09:32:17 up 8:41, 1 user, load average: 0.01, 0.00, 0.00 其中8:41代表系统已经运行8小时41分 2.查看/pr ...
- 常用http请求状态码含义
1** ----临时响应 2** ----成功响应 3** ----重定向 4** ----请求错误 5** ----服务器错误 常用的几个如下: 200---服务器成功返回网页 301-- ...
- Lua标准库(转)
转载地址:http://www.yiibai.com/lua/lua_standard_libraries.html Lua的标准库提供了一组丰富的功能,与C的API直接实现,建立在Lua编程语言函数 ...
- Openstack学习历程_1_视频
学习视频:讲解Openstack每个模块对应的作用
- Spark读取HDFS文件,文件格式为GB2312,转换为UTF-8
package iie.udps.example.operator.spark; import scala.Tuple2; import org.apache.hadoop.conf.Configur ...
- hdu 5093 Battle ships
二分图匹配 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> ...
- eBay_Relist(退换刊登费)
如果物品首次刊登结束时没有人中标,或是买家并没有付款完成交易,那么卖家以通过重新刊登的方法来再次销售.如果该物品在第二次刊登时成功售出,且满足eBay的重新刊登退费条件,那么eBay便会退还重新刊登的 ...