微信号:gh_61e2455df34c

介绍:介绍R语言的学习和使用,关注数据挖掘算法,利用R语言实现常见的数据挖掘算法,并配以有趣的NBA数据分析案例.不管您是初学还是精通R语言,本平台都致力于让您能从中获益.

数据可视化之——REmap

2016-09-15 11:29 №→★飞刀

REmap是ECharts中交互地图可视化功能的R接口,通过它可以直接使用R代码(而不必写JS代码)来实现交互地图可视化。本文将介绍如何使用REmap包实现全国主要城市天气可视化。

1 准备工作

  • 1.1 安装R和RStudio

这部分参见微信公众号中学习课堂菜单R语言基础子菜单下的R及其拓展包的安装和使用,这里不再赘述。建议安装R-3.2.5版本。

  • 1.2 安装REmap

打开Rstudio命令行控制台,输入以下命令:

library(devtools)
install_github('lchiffon/REmap')

请注意,以上命令默认你已经安装了devtools,如果你没有安装devtools,那么请先安装之。

  • 1.3 准备三张天气图片 

图片你可以自行百度或者设计,或者直接引用我放在github上的图片,图片链接地址见文中可视化代码部分,图片形式大致如下:

天气数据我做了简化,简化后只有晴天、多云以及阴天三种。

载入REmap包

library(rvest) #用来爬取数据
library(REmap) #实现地图可视化
options(remap.js.web=T)

设置options(remap.js.web=T)后,生成的html文件将会保存在当前工作目录,否则它会保存在一个默认的临时文件夹中。

3 爬取天气数据

选择中央气象台的天气数据,采用rvest包爬取天气数据:

website <- "http://www.nmc.cn/publish/forecast/china.html"
web <- html(website,encoding = "UTF-8")
dat <- web %>% html_nodes("div.area") %>% html_nodes("ul")  %>% html_nodes("li") %>% html_text()
dat0 <- sapply(dat,FUN = function(x){  temp  <- strsplit(x,split = "[\n]+")[[1]]    item <- gsub(pattern = "\\s+",replacement = "",x = temp)    res <- item[item!=""]  res})
dat0 <- t(dat0)
dat0 <- as.data.frame(dat0,row.names=1:nrow(dat0),stringsAsFactors=FALSE)
head(dat0)
V1 V2 V3
北京 多云 20℃
西青 20℃
天津 21℃
滨海新区 21℃
石家庄 19℃
张家口 13℃

生成了三列数据,包括城市名称、天气状况以及温度。可以看到用rvest包来爬取数据着实好用,强烈推荐大家使用。

数据整理

继续整理数据,生成衍生变量:weatherc

colnames(dat0) <- c("area","weather","temperature")
dat0$weather <- gsub(pattern = "~",replacement = "转",x = dat0$weather)
dat0$temperature <- gsub(pattern = "~",replacement = "-",x = dat0$temperature)
dat0 <- tail(dat0,32)
weather <- substr(dat0$weather,1,3)
ind1 <- grep("晴",weather)
ind20 <- grep("云",weather)
ind21 <- grep("阴",weather)
ind2 <- c(ind20,ind21)
ind3 <- grep("雨",weather)
dat0$weatherc <- NA
dat0$weatherc[ind1] <- "sunny"
dat0$weatherc[ind2] <- "cloudy"
dat0$weatherc[ind3] <- "rainy"
dat0 <- dat0[-c(1,6),]
head(dat0)
area weather temperature weatherc
太原 13℃ sunny
呼和浩特 11℃ sunny
沈阳 多云 17℃ cloudy
长春 多云 16℃ cloudy
上海 小雨 22℃ rainy
南京 阵雨 21℃ rainy

整理后的数据如上,最后一列weatherc表示简化后的天气类型,即是sunnycloudy还是rainy,其中小雨转多云、多云转晴这些天气状况直接就简化为rainy以及cloudy,简化后方便与准备工作3中所表示的三种天气图片相对应。

具体的代码不做详细分析,中间涉及到正则匹配和替换,如果你不了解正则,去百度搜搜三十分钟学会正则表达式,你就能大致明白。

我想特别说明的是,作者的这个包里提取经纬度的函数get_city_coord在提取三个字的城市时存在BUG,所以上述代码在最后使用代码dat0[-c(1,6),]时暂时去掉了三个字的城市数据。该部分BUG已经提交给作者,相信很快就会修复。

可视化展示

可视化展示的三个步骤:

  1. 采用get_city_coord获取城市的经纬度数据

  2. 封装城市的图片以及标签信息

  3. 采用remapB获做城市天气可视化展示

remapB函数相关参数说明:

  • makePointData:城市相关信息,包括需要展示的天气状况图片以及文字信息

  • geoData:城市对应的经纬度

  • color:地图的主题颜色

  • makePointTheme:控制显示的图片的大小,显示效果等等

# remap.init()
geoData <- sapply(dat0$area, get_city_coord)
citynames <- dimnames(geoData)[[2]]
geoData <- as.data.frame(t(geoData),row.names = 1:nrow(geoData),stringsAsFactors = FALSE)
colnames(geoData) <- c("lon","lat")
geoData$city <- citynames
symbol <- paste0("image://https://raw.githubusercontent.com/feilx/weatherVisualization/master/dic/",dat0$weatherc,".png")
tooltip <- paste(a=dat0$area,"__________",dat0$weather,dat0$temperature,sep="<br>")
newdata <- data.frame(a=dat0$area,symbol=symbol,tooltip=tooltip,stringsAsFactors=FALSE)
p <- remapB(markPointData = newdata,geoData = geoData,color="Blue",title = "全国主要城市天气",markPointTheme = markPointControl(symbolSize=20,effectType='bounce',effect=T,color = "Random"))
p

展示结果如下图,我在这里截了一个屏,而其实这张图是动态的,天气图标会有一个浮动的效果,并且鼠标移动到天气图标上,会有一个文字效果展示具体的天气和温度数据。


小结

本文实现了全国主要城市天气可视化,这仅是REmap包的一个应用,它还可以用来做著名的百度迁徙图以及城市热力图等等。在此抛砖引玉,剩下的留给大家自己去探索。

REmap包的官方文档详见:

https://github.com/Lchiffon/REmap


 本文来自№→★飞刀的微信公共帐号“数据挖掘与R语言”,用微信添加数据挖掘与R语言公众号,即可订阅。转载必须保留作者、公共帐号信息。

长按识别图中二维码 



 
数据挖掘与R语言 更多文章 数据挖掘十大算法 数据处理之——data.table 数据处理之——dplyr xgboost:速度快效果好的Boosting模型 数据处理之——plyr
猜您喜欢 php 执行shell命令的函数 如何1年获得别人3年的工作经验(实用有深度!) 解读C指针 新手学习编程的最佳方式是什么? 途牛原创 | 大话权限中心的PHP架构之道