文章摘自天善智能社区,转载请注明来源。

我是小魔方,此魔方非彼魔方!

最近学了些revst包的基础知识,勉强能爬到一些有用的数据,刚好趁着周末,捂着脸跟大家分享。

这一篇使用revst包爬取了中国环保部环境监测中心公布367个主要城市的日度AQI指数信息(2017年1~7日),由于个别城市数据有缺失,可视化过程可能会遗漏部分城市信息。

以下是本篇需要加载的环境包:

library(rvest)

library(stringr)

library(dplyr)

library(ggplot2)

library(plyr)

library(maptools)

library(ggmap)

library(Hmisc)

library(leafletCN)

library(ggthemes)

---------------------------------------------------------------------------------------------------------------

使用revst包爬取了2017年1日至7日的367各主要城市AQI指数数据:

url<-"http://datacenter.mep.gov.cn/report/air_daily/air_dairy.jsp?city=&startdate=2017-01-01&enddate=2017-01-07&page="

final <- data.frame()

for (m in 1:86){

fun<-function(m){

url<-paste(url,m,sep='')

web<-read_html(url,encoding="UTF-8")

Num<-web %>% html_nodes("tr>td:nth-child(1)") %>% html_text()

City<-web %>% html_nodes("tr>td:nth-child(2)") %>% html_text()

Date<-web %>% html_nodes("tr>td:nth-child(3)") %>% html_text()

AQI<-web %>% html_nodes("tr>td:nth-child(4)") %>% html_text()

Level<-web %>% html_nodes("tr>td:nth-child(5)") %>% html_text()

Mainpo<-web %>% html_nodes("tr>td:nth-child(6)") %>% html_text()

final<-data.frame(Num=Num[6:35],City=City[6:35],Date=Date[4:33],

AQI=AQI[4:33],Level=Level[3:32],Mainpo=Mainpo[2:31],

stringsAsFactors =FALSE)

}

final<-rbind(final,fun(m))

}

数据预处理:

final<-final[1:2569,]

final$AQI<-as.numeric(final$AQI)

final$Level<-factor(final$Level,levels=c("重度污染","严重污染","轻度污染","中度污染","良","优"),order=TRUE)

address<-unique(final$City)

add<-get_geo_position(address)

final1<-merge(final,add, by.x = "City", by.y = "city",all.x=TRUE)

final1$day<-substr(final1$Date,10,10)

names(final1)

final1<-final1[,c("City","Num","Date","day","AQI","Level","Mainpo","lon","lat")]

newdata1<-final1[,c("City","lon","lat","day","AQI","Level","Mainpo")]

地图素材导入:

china_map<-readShapePoly("c:/rstudy/bou2_4p.shp")

x <- china_map@data

xs <- data.frame(id=row.names(x),x)

china_map1 <- fortify(china_map)

china_map_data <- join(china_map1, xs, type = "full")

mydata <- read.csv("c:/rstudy/geshengzhibiao.csv")

china_data <- join(china_map_data, mydata, type="full")

首先查看下所选取的367个主要城市在全国的分布情况:

ggplot()+

geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+

geom_point(data=newdata1,aes(x=lon,y=lat),colour="red")+

coord_map("polyconic") +

theme_nothing()

用气泡图展示主要城市AQI指数相对高低(气泡图大小及颜色深浅均表示AQI指数强弱)

(以下数据基于2017年1日~7日367个城市的平均AQI指数数据)

newdata2<-newdata1[,c("City","day","AQI")];newdata2$day<-as.factor(newdata2$day)

newdata2<-tapply(newdata2$AQI,list(newdata2$City),mean,na.rm=TRUE)

newdata2<-as.data.frame(newdata2)

newdata2$Address<-rownames(newdata2)

names(newdata2)<-c("AQIM","Address");newdata2<-newdata2[,c("Address","AQIM")]

newdata2<-na.omit(newdata2)

mynewdata<-merge(newdata2,add, by.x = "Address", by.y = "city",all.x=TRUE)

ggplot()+

geom_polygon(data=china_data,aes(x=long,y=lat,group=group),fill="white",colour="grey60")+

geom_point(data=mynewdata,aes(x=lon,y=lat,size=AQIM,fill=AQIM),shape=21,colour="black")+

scale_size_area(max_size=5)+

scale_fill_gradient(low="white",high="#D73434")+

coord_map("polyconic") +

theme_nothing()

使用中心辐射热度图及散点图叠加可以在宏观上洞察全国各省各地区的空气质量级别及集中分布趋势:

ggplot()+

geom_polygon(data=china_map,aes(x=long,y=lat,group=group),fill="#005A32",col="white")+

geom_polygon(data=mynewdata,aes(x=lon,y=lat,fill = ..level..), stat="density_2d", alpha = .5, color = NA)+

coord_map("polyconic") +

geom_point(data=mynewdata,aes(x=lon,y=lat),col="red",size=1)+

scale_fill_gradient2( low = "white",mid="yellow", high = "red")+

theme_nothing()

使用热力地图查看整体城市空气质量的地域分布特征:

geojsonMap(mynewdata,"city",popup = paste0(mynewdata$Address,":",dat$AQIM),palette = "Reds", legendTitle = "AQI Index")

AQI指数最高的10个城市:

mynewdata3<-newdata2[order(-newdata2$AQIM),][1:10,]

ggplot(mynewdata3,aes(reorder(Address,AQIM),AQIM))+

geom_bar(stat="identity",position="dodge",fill="#D6B869")+

theme_wsj()+

coord_flip()+

scale_fill_wsj("rgby", "")+

theme(axis.ticks.length=unit(0.5,'cm'))+

geom_text(aes(label=round(AQIM+0.05,1)), position = position_dodge(0.9),hjust=1.1,colour="white",size=5)+

guides(fill=guide_legend(title=NULL))+

ggtitle("十大污染最严重城市")+

theme(

axis.title = element_blank(),

legend.position='none',

panel.grid.major.x=element_line(linetype="dashed",colour="grey60"),

panel.grid.major.y=element_blank(),

axis.ticks.x=element_blank(),

axis.ticks.y=element_line(),

axis.ticks.length=unit(0.3,'cm'),

axis.line.x=element_blank(),

axis.line.y=element_line(),

axis.text.x=element_text(size=10),

)

因为所收集的数据中,行政区划名称与现有地图素材有出入,鉴于城市较多,匹配比较麻烦,暂时没有制作基于空气质量水平的离散填充地图,但是方法之前已经多有介绍,感兴趣的小伙伴儿可以借此自己练习。

声明:

以上仅作为个人练习爬虫,不代表官方观点,数据处理过程不敢保证精确,仅供参考,请谨慎使用!

2017年的第一周,你吸了多少雾霾?R语言告诉你(代码)相关推荐

  1. python第一周学习总结+初辨python与c语言的区别

    首先是python的第一周学习总结 从注释.变量.字符串格式化,到运算符和流程控制,再到数据类型 1.注释:python的单行注释是# (快捷键是Ctrl+/),多行注释""&qu ...

  2. r语言在linux下取数据,菜鸟第一步,跪在数据处:R语言读取数据

    1. 温故知坑 实践是学习知识的最好途径.之前我讲的内容都非常非常基础,包括: (1)什么是R语言?R语言和Rstudio软件的安装,Rstudio的界面介绍: (2)R语言的基本逻辑,基本数据类型: ...

  3. 张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结

    20162329 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 通过打书上的代码熟悉了Java编程的基本过程 教材学习中的问题和解决过程 1.因为我的虚拟机 ...

  4. C语言编程>第一周 ⑧ 输入两个正整数m和n,求其最大公约数和最小公倍数。

    例题:输入两个正整数m和n,求其最大公约数和最小公倍数. 代码如下: /*程序分析:利用辗除法.*/ #include"stdio.h" main() {int a,b,num1, ...

  5. C语言编程>第一周 ③ 输入某年某月某日,判断这一天是这一年的第几天

    例题:输入某年某月某日,判断这一天是这一年的第几天 程序分析:以2020年8月8日为例,应该先把前八个月的加起来,然后再加上8天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 代码如 ...

  6. C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示

    例题:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 代码如下: /*程序分析:利用条件运算符,如(a>b)?a:b的 ...

  7. C语言编程>第一周 ⑥ 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

    例题:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153等于 ...

  8. R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致

    R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致 目录 R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致

  9. 2017暑假 第一周 学习总结(复习)

    2017暑假 学习总结目录: 1 2 3 4 Time:7.3 ~ 7.9 Content:再次认识Java,熟悉环境配置,HelloWorld 基本结构,了解开发工具 eclipse,标识符命名规范 ...

  10. 2018年第一周APP黑马榜单

    互联网+战争中战的就是速度.在众多定制开发APP的公司还没做好2018年规划的时候,有几个APP杀出重围,赚得第一桶金.小编今天就来带你走进2018第一周APP黑马榜单. 一.冲顶大会--思聪撒币,头 ...

最新文章

  1. jQuery 效果 - 滑动
  2. ETSafeMail安全电子邮件技术白皮书
  3. 回归分析残差不满足正态分布_线性回归思路梳理!精华必看!
  4. 图片效果集合(js、jquery或html5)
  5. Windows vpn 远程桌面 使用快捷键
  6. MapReduce之InputFormat理解
  7. POJ1006 中国剩余定理
  8. 计算机硬盘使用率,硬盘占用率和速度
  9. 嵌入式物联网技术开发指导349014857
  10. Android—在WebView中下载Blob协议文件
  11. Windows文件资源管理器,搜索框的使用技巧
  12. Java安装详细步骤(win10)
  13. 电力电子系统的保护设计
  14. python 网络编程是什么_什么是网络编程-Python 网络编程-嗨客网
  15. Python UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xbb in position 0: invalid start byte
  16. LabVIEW之MSComm控件注册
  17. 苹果mp3软件_一款非常不错的音频格式转换软件
  18. 当幸福来敲门(The Pursuit of Happyness)和程序员人生
  19. java用按钮控制文本框隐藏与显示_编写JAVA程序,在其中有一个按钮和一个文本框。单击按钮时,文本框中显示按钮上显示的字。...
  20. InfoPath与 数据库源码下载

热门文章

  1. android 系统字体无效,android内嵌H5页面,字体设置失效的问题
  2. SQL Server 数据库之生成与执行 SQL 脚本
  3. 网络安全实验8 基于网络入侵检测系统
  4. 网站在微信中提示从浏览器打开
  5. WebApi生成接口文档
  6. 在线合成车牌照片【模拟车牌,用于车牌识别项目测试】
  7. 企业 IT 架构转型之道 阿里巴巴中台战略思想与架构实战
  8. 用代码查询ASCII码和Unicode码表序号
  9. ps关于计算机logo设计,做LOGO运用ps界面技巧
  10. Python计算器程序实现,支持括号与符号检测、小数、负数运算