莆田医院的可视化(R)
Idea来自于这里原文作者用python完成了数据爬取,可视化的过程,本文用R实现一遍…
基本的流程如下:
- 爬取数据与整理
- 根据医院获取经纬度
- 根据获取的经纬度完成可视化
最终结果是一个可交互的地图,像这样(截图版):
数据爬取与整理
数据来源于凤凰资讯,由于数据隐藏在JS代码中,所以我们使用readLines
读取,字符处理的方式获得数据.
1 2 3 4
| raw = readLines("http://news.ifeng.com/mainland/special/ptxyy/", encoding = "UTF-8") rawHospital = raw[123 : 238] rawHospital[1]
|
1
| [1] " ['上海','上海市闵行区中医院<br/>上海华美美莱整形医院<br/>上海万众医院<br/>上海安真医院<br/>上海福华医院<br/>上海玛丽女子医院<br/>上海真爱女子医院<br/>上海心脏病医院<br/>上海远大心胸医院<br/>上海仁爱医院<br/>上海天大医疗美容医院<br/>上海沪申五官科医院<br/>上海博爱医院<br/>上海新虹桥医院<br/>上海九龙男子医院<br/>上海城市女子医院<br/>上海西郊骨科医院<br/>上海真美妇科医院<br/>上海南浦妇科医院<br/>上海虹桥医院<br/>上海健桥医院<br/>上海博爱医院<br/>上海长江医院<br/>解放军411医院<br/>上海阳光中医医院<br/>上海英港泌尿外科医院<br/>上海阿波罗男子医院<br/>上海玫瑰女子医院<br/>上海康新医院<br/>上海圣爱医院<br/>上海同德医院<br/>上海安平医院<br/>江东泌尿外科医院<br/>上海九州泌尿医院<br/>上海青城医院<br/>上海博大医院<br/>上海中亚医院','38'],"
|
接下来,用一个函数提取每个rawHospital
中的医院名,并整理成一个字符向量.
1 2 3 4 5 6 7 8 9 10
| extFun = function(x){ split = strsplit(x, "','") out = strsplit(split[[1]][2], "<br/>") return(out) } extFun(rawHospital[1]) hosList = sapply(rawHospital,extFun) hospital = c() for(i in 1:length(hosList)) hospital = append(hospital, hosList[[i]]) head(hospital)
|
1 2 3
| [1] "上海市闵行区中医院" "上海华美美莱整形医院" [3] "上海万众医院" "上海安真医院" [5] "上海福华医院" "上海玛丽女子医院"
|
获取经纬度
获取经纬度使用某大神的baidumap
repo在这里(不要纠结为啥还用百度,可视化也是…)
1 2 3 4
| library(baidumap) blackHospital = getCoordinate(hospital, formatted = T) blackHospital = na.omit(blackHospital) head(blackHospital)
|
1 2 3 4 5 6 7
| longtitude latitude 上海市闵行区中医院 121.4250 31.09354 上海华美美莱整形医院 121.4290 31.23277 上海万众医院 121.4267 31.19537 上海安真医院 121.2353 31.00906 上海福华医院 121.7532 31.04560 上海玛丽女子医院 121.1253 31.15449
|
完成了,有一个医院经纬度没找到,用na.omit
删去,稍微整理一下:
1 2 3
| plotdata = data.frame(lon = blackHospital[,1], lat = blackHospital[,2], city = rownames(blackHospital))
|
可视化
不好意思,只会REmap
,代码见下,用鼠标滚轮和拖动查看细节:
1 2 3 4 5 6 7
| library(REmap) remapB(markPointData = data.frame(plotdata$city), markPointTheme = markPointControl(symbol = "pin", effect=F, symbolSize = 5, color="red"), geoData = plotdata)
|
还是贴张截图吧…万一有手机党呢..
最后,把所有的代码放在一起,方便大家调用(顺便我可以数一下有几行,不到30,啧啧啧)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| raw = readLines("http://news.ifeng.com/mainland/special/ptxyy/", encoding = "UTF-8") rawHospital = raw[123 : 238]
extFun = function(x){ split = strsplit(x, "','") out = strsplit(split[[1]][2], "<br/>") return(out) } extFun(rawHospital[1]) hosList = sapply(rawHospital,extFun) hospital = c() for(i in 1:length(hosList)) hospital = append(hospital, hosList[[i]])
library(baidumap) blackHospital = getCoordinate(hospital, formatted = T) blackHospital = na.omit(blackHospital) plotdata = data.frame(lon = blackHospital[,1], lat = blackHospital[,2], city = rownames(blackHospital))
library(REmap) remapB(markPointData = data.frame(plotdata$city), markPointTheme = markPointControl(symbol = "pin", effect=F, symbolSize = 5, color="red"), geoData = plotdata)
|