R(四): R開發實例-map分佈圖

来源:http://www.cnblogs.com/tgzhu/archive/2016/08/16/5775829.html
-Advertisement-
Play Games

前幾章對R語言的運行原理、基本語法、數據類型、環境部署等基礎知識作了簡單介紹,本節將結合具體案例進行驗證測試。 案例場景:從互聯網下載全國三甲醫院數據,以地圖作為背景,展現各醫院在地圖上的分佈圖。全國三甲醫院數據來源 http://www.wxmp.cn/cms/detail-51610-23480 ...


      前幾章對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)
    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="\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)
    }
    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 即可得到上所示效果圖

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • × 目錄 [1]引入 [2]特點 [3]使用[4]相容[5]應用 前面的話 與setTimeout和setInterval不同,requestAnimationFrame不需要設置時間間隔。這有什麼好處呢?為什麼requestAnimationFrame被稱為神器呢?本文將詳細介紹H5新增的定時器r ...
  • jquery easyui使用······(一) ...
  • 新人剛學習Android兩周,寫一個隨筆算是對兩周學習成果的鞏固,不足之處歡迎各位建議和完善。 這次寫的是一個簡單登錄案例,大概功能如下: 註冊的賬戶信息用SharedPreferences存儲; 登錄成功後跳轉到成功頁面,在成功頁面聯網請求圖片並寫入到外部存儲; 然後讀出顯示在成功頁面; 註冊xm ...
  • Swift - EasingAnimation繪製圓環動畫 效果 源碼 https://github.com/YouXianMing/Swift-Animations ...
  • 一個懶人如何做到有條理、有效率的學習? 作為一個懶人,對於費事費力的學習我是拒絕的,那麼我就該考慮,怎麼才能做到高效快速的學習呢?於是在不斷總結中找到自己的學習方法,在這裡發出來給大家借鑒一下,取其精華去其糟粕,不喜勿噴哦。 我的學習方法就是帶著問題去學習理解,然後實戰應用並做好筆記。這四點缺一不可 ...
  • 要點: 1、多種形態,引用的多種形態對於一個引用變數,可以指向任何類的對象。對於一個父類的引用(類與類之間有一種繼承關係),可以指向子類,也可以指向本類,指向的類型不同。當通過此引用向對象發送消息,調用的方法是不同的,此時方法的調用就是多態。 2、類與類之間有關係,繼承關係父類的引用可以指向子類的引 ...
  • 工作筆記記錄,會持續更新.... 目錄: apply tapply lapply sapply merge apply函數: apply:apply的中文意思是應用,這個函數的意思是通過將一個函數應用到矩陣或數組中,返回一個向量或數組 語法:apply(X, MARGIN, FUN, ...) , ...
  • 在我的實際工作中,數據來源一方面是關係型資料庫MS SqlServer, 別一方面是HBase。本節主要介紹通過RODBC訪問MS SqlServer 安裝配置,參見資料(https://msdn.microsoft.com/en-us/library/hh568454(v=sql.110).asp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...