zoukankan      html  css  js  c++  java
  • 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=" ":
      #读取数,删除空值
      pdata<-read.csv("d:\data.txt",sep="	",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)
      View Code
    • 清理前后的数据对比图如下:

    •  

    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="	",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)
      }
      View Code
    •  说明: 本例代码是发布到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 即可得到上所示效果图

      

  • 相关阅读:
    winfrom绘制渐变 / 调用浏览器访问指定地址
    解决sever 2008中tomcat的报错 init Failed to initialize end point associated with ProtocolHandler ["http-nio-80"]
    SizeGripStyle 枚举
    不安全代码只会在使用/unsafe 编译的情况下出现
    VS2017自定义代码片段, 实现快捷输入
    C#获取程序代码执行时长
    C#简单操作XML
    数据库基线检查工具DB_BASELINE
    SQLmap使用手册小结(二)
    SQLmap使用手册小结(一)
  • 原文地址:https://www.cnblogs.com/tgzhu/p/5775829.html
Copyright © 2011-2022 走看看