用于生成数据文件的R语言的函数实现。

> filename loadDate',date))+ city-read.csv(file='woeid.csv',header=false,fileencoding='utf-8',>-c('en','woeid','zh','prov','long','lat')+>-city[-nrow(city),]++>-do.call(rbind,>-cbind(city,wdata)+>-function(date){>-function(date=sys.time()){>

运行程序loadDate()的函数,程序会根据城市列表的数据,调用getWeather()函数自动爬取我们定义的所有城市的天气数据。

> date=Sys.time();date # 选择日期[1] '2014-10-01 13:01:08 CST'> loadDate(date) # 爬取数据[1] 'Date ==> 2014-10-01 13:01:08'[1] '2151330 ==> 9 13 21 59 4.1 1016.4 0'[1] '2151849 ==> 18 23 30 57 9.99 1015.92 0'[1] '2159908 ==> 12 22 30 58 9.99 1017 0'[1] '20070171 ==> 16 22 26 79 NA 1013.6 0'[1] '2141166 ==> 2 13 34 29 9.99 1015.92 0'[1] '2137321 ==> 3 6 11 81 9.99 1015.92 1'[1] '2148332 ==> 7 16 34 27 9.99 1015.92 0'[1] '2149760 ==> 4 19 30 59 9.99 982.05 0'[1] '2171287 ==> 12 14 11 94 2.49 982.05 2'[1] '26198317 ==> 12 23 34 52 9.99 1015.92 2'[1] '2145605 ==> 6 17 20 82 8 812.73 0'[1] '2138941 ==> 3 21 32 63 9 745.01 0'[1] '2157249 ==> 13 23 11 91 2.99 1017.9 0'[1] '2150551 ==> 8 22 28 60 7 1016.8 0'[1] '2172736 ==> 13 19 32 52 8 1015.92 0'[1] '2168327 ==> 14 22 32 49 NA 1017 0'[1] '2154547 ==> 9 18 20 88 1.59 982.05 2'[1] '2127866 ==> 17 23 34 60 9.99 1015.92 2'[1] '2163866 ==> 19 26 28 78 6 982.05 2'[1] '26198213 ==> 21 28 28 65 9.99 982.05 2'[1] '2137081 ==> 15 23 34 57 9.99 1015.92 2'[1] '2158433 ==> 19 27 20 69 4.01 1015.92 0'[1] '2146703 ==> 18 26 28 73 9.99 1015.92 0'[1] '2160693 ==> 13 23 28 64 9.99 1015.92 2'[1] '2166473 ==> 24 32 30 62 9.99 982.05 0'[1] '26198235 ==> -1 15 30 50 NA 643.41 0'[1] '2132574 ==> 16 23 30 53 9.99 1015.92 0'[1] '26198151 ==> 21 27 20 75 7 1016.4 0'[1] '2161838 ==> 25 31 28 58 8 982.05 2'[1] '2139963 ==> 21 29 28 65 9.99 982.05 0'[1] '2306179 ==> 24 28 28 70 9.99 982.05 0'[1] '2162779 ==> 24 31 30 58 9.99 982.05 0'[1] '24865698 ==> 26 30 30 59 9.99 982.05 2'

程序运行完成后,会在当前目录生成一个名字为20141001.csv文件。打开20141001.csv文件,这个文件就是接下来用于生成可视化图片的基础数据了。

'en','woeid','zh','prov','long','lat','low','high','code','humidity','visibility','pressure','rising''beijing',2151330,'北京','北京市',116.4666667,39.9,'9','13','21','59','4.1','1016.4','0''shanghai',2151849,'上海','上海市',121.4833333,31.23333333,'18','23','30','57','9.99','1015.92','0''tianjin',2159908,'天津','天津市',117.1833333,39.15,'12','22','30','58','9.99','1017','0''chongqing',20070171,'重庆','重庆市',106.5333333,29.53333333,'16','22','26','79',NA,'1013.6','0''harbin',2141166,'哈尔滨','黑龙江省',126.6833333,45.75,'2','13','34','29','9.99','1015.92','0''changchun',2137321,'长春','吉林省',125.3166667,43.86666667,'3','6','11','81','9.99','1015.92','1''shenyang',2148332,'沈阳','辽宁省',123.4,41.83333333,'7','16','34','27','9.99','1015.92','0''hohhot',2149760,'呼和浩特','内蒙古自治区',111.8,40.81666667,'4','19','30','59','9.99','982.05','0''shijiazhuang',2171287,'石家庄','河北省',114.4666667,38.03333333,'12','14','11','94','2.49','982.05','2''wulumuqi',26198317,'乌鲁木齐','新疆维吾尔自治区',87.6,43.8,'12','23','34','52','9.99','1015.92','2''lanzhou',2145605,'兰州','甘肃省',103.8166667,36.05,'6','17','20','82','8','812.73','0''xining',2138941,'西宁','青海省',101.75,36.63333333,'3','21','32','63','9','745.01','0''xian',2157249,'西安','陕西省',108.9,34.26666667,'13','23','11','91','2.99','1017.9','0''yinchuan',2150551,'银川','宁夏回族自治区',106.2666667,38.33333333,'8','22','28','60','7','1016.8','0''zhengzhou',2172736,'郑州','河南省',113.7,34.8,'13','19','32','52','8','1015.92','0''jinan',2168327,'济南','山东省',117,36.63333333,'14','22','32','49',NA,'1017','0''taiyuan',2154547,'太原','山西省',112.5666667,37.86666667,'9','18','20','88','1.59','982.05','2''hefei',2127866,'合肥','安徽省',117.3,31.85,'17','23','34','60','9.99','1015.92','2''wuhan',2163866,'武汉','湖北省',114.35,30.61666667,'19','26','28','78','6','982.05','2''changsha',26198213,'长沙','湖南省',113,28.18333333,'21','28','28','65','9.99','982.05','2''nanjing',2137081,'南京','江苏省',118.8333333,32.03333333,'15','23','34','57','9.99','1015.92','2''chengdu',2158433,'成都','四川省',104.0833333,30.65,'19','27','20','69','4.01','1015.92','0''guiyang',2146703,'贵阳','贵州省',106.7,26.58333333,'18','26','28','73','9.99','1015.92','0''kunming',2160693,'昆明','云南省',102.6833333,25,'13','23','28','64','9.99','1015.92','2''nanning',2166473,'南宁','广西壮族自治区',108.3333333,22.8,'24','32','30','62','9.99','982.05','0''lasa',26198235,'拉萨','西藏自治区',91.16666667,29.66666667,'-1','15','30','50',NA,'643.41','0''hangzhou',2132574,'杭州','浙江省',120.15,30.23333333,'16','23','30','53','9.99','1015.92','0''nanchang',26198151,'南昌','江西省',115.8666667,28.68333333,'21','27','20','75','7','1016.4','0''guangzhou',2161838,'广州','广东省',113.25,23.13333333,'25','31','28','58','8','982.05','2''fuzhou',2139963,'福州','福建省',119.3,26.08333333,'21','29','28','65','9.99','982.05','0''taipei',2306179,'台北','台湾省',121.5166667,25.05,'24','28','28','70','9.99','982.05','0''haikou',2162779,'海口','海南省',110.3333333,20.03333333,'24','31','30','58','9.99','982.05','0''hongkong',24865698,'香港','香港特别行政区',114.1666667,22.3,'26','30','30','59','9.99','982.05','2'

数据一共有10列,字段解释:en,城市英文名

woeid, Yahoo天气API定义的WOEID,用于匹配城市

zh,城市中文名

prov,城市所在省的中文名

long,经度(中国处于东经,不区别东经西经)

lat,纬度(中国处于北纬,不区别南纬北纬)

low,最低温度

high,最高温度

code,天气概括代码

humidity,湿度

visibility,能见度

pressure,大气压

rising,气压变动

这样数据就准备好了,那么接下来就是把天气数据对应到中国行政区地图上了。

3.3 中国地国加载

R语言通过第三方的地图R包,可以很方便的实现基于地图的可视化或基于地理信息的数据处理。那么R语言是如何做到的呢,是通过maps, mapdata, maptools这3个包合作完成的。

我们调用maptools包的readShapePoly()函数,加载中国行政区地图的数据信息,保存在map的变量中,直接用plot()函数就可以看到可视化的效果了。地图数据是我提前下载好的,保存放在mapdata目录中,一共全部3个文件bou2_4p.dbf,bou2_4p.shp和bou2_4p.shx。

> library(maps)> library(mapdata)> library(maptools)> map plot(map) # 画出中国行政区图-readshapepoly('mapdata>

是不是很神奇,2行就画出是中国行政区地图的轮廓,我们再继续来分析map这个变量。先检查一下的map的类型,发现是sp包中定义的SpatialPolygonsDataFrame类型的。

> class(map) # 查看map对象类型[1] 'SpatialPolygonsDataFrame'attr(,'package')[1] 'sp'

SpatialPolygonsDataFrame类型我们并不熟悉,再用pryr包的otype查检一下,面向对象系统的类型。

> library(pryr)> otype(map) # 发现是S4类型的data.frame[1] 'S4'

R语言基于S4的面向对象编程一文,我们已经掌握了S4类型的基础知识,在知道map是一个S4类型的实例后,大概就能猜出这个对象如何使用了。另外从命名上看,SpatialPolygonsDataFrame类型,应该是用data.frame存储了SpatialPolygons的类型的数据。 先通过length()函数和names()函数,从data.frame的角度查看一下map对象,包括7列925行。

> length(map) # 一共有925条记录[1] 925> names(map) # data.frame包括有7列[1] 'AREA' 'PERIMETER' 'BOU2_4M_' 'BOU2_4M_ID' 'ADCODE93'[6] 'ADCODE99' 'NAME'

再通过str()函数查看map对象第一行数据的静态结构。

> str(map[1,])Formal class 'SpatialPolygonsDataFrame' [package 'sp'] with 5 slots ..@ data :'data.frame': 1 obs. of 1 variable: .. ..$ AREA: num 54.4 ..@ polygons :List of 1 .. ..$ :Formal class 'Polygons' [package 'sp'] with 5 slots .. .. .. ..@ Polygons :List of 1 .. .. .. .. ..$ :Formal class 'Polygon' [package 'sp'] with 5 slots .. .. .. .. .. .. ..@ labpt : num [1:2] 127.8 47.9 .. .. .. .. .. .. ..@ area : num 54.4 .. .. .. .. .. .. ..@ hole : logi FALSE .. .. .. .. .. .. ..@ ringDir: int 1 .. .. .. .. .. .. ..@ coords : num [1:5784, 1:2] 121 121 122 122 122 ... .. .. .. ..@ plotOrder: int 1 .. .. .. ..@ labpt : num [1:2] 127.8 47.9 .. .. .. ..@ ID : chr '0' .. .. .. ..@ area : num 54.4 ..@ plotOrder : int 1 ..@ bbox : num [1:2, 1:2] 121.2 43.4 135.1 53.6 .. ..- attr(*, 'dimnames')=List of 2 .. .. ..$ : chr [1:2] 'x' 'y' .. .. ..$ : chr [1:2] 'min' 'max' ..@ proj4string:Formal class 'CRS' [package 'sp'] with 1 slots .. .. ..@ projargs: chr NA

从这两个维度的观察,我们基本清楚map的结构,map里每一行是一个SpatialPolygonsDataFrame对象,包括5个属性,用于存储地图数据信息。取第一行数据data属性,查看结果,发现是黑龙江省的行政区地图数据。

> map[1,]@data AREA PERIMETER BOU2_4M_ BOU2_4M_ID ADCODE93 ADCODE99 NAME0 54.447 68.489 2 23 230000 230000 黑龙江省

用第一行数据画图。

> plot(map[1,])

如果取前100行数据画图,那么应该是部分中国省的行政区地图了,果然如我所料。

> plot(map[1:100,])

由于本文并不是地图包的详细介绍,只要了解到map对象的基本使用就行了,稍后在博客中我会单独介绍用R做地图可视化的开发。

3.4 数据可视化

完成了地图数据加载后,再接下来就是数据可视化了。数据可视化,我认为要分成2部分操作,一部分是数据处理,另一部分是可视化输出。

我们先想一下要怎么进行数据处理,才能把天气数据和地图数据结合起来呢。我们的目标是要画出中国各省天气概况,会用到过之前过滤出的数据中code的数据,code的数据都是代码,我们还要定义code代码和实际意义的映射关系。

Yahoo的源数据中,一共定义了49种天气情况,如code.csv文件所示,根据描述我把相似的天气情况进行合并,最后保留18种天气概况特征。code代码映射文件为lablecode.csv。

code.csv文件。

'code','en','zh','type'0,tornado,龙卷风,31,tropical storm,热带风暴,22,hurricane,暴风,33,severe thunderstorms,强雷雨天气,164,thunderstorms,雷雨,115,mixed rain and snow,雨雪,126,mixed rain and sleet,雨雪,127,mixed snow and sleet,雨雪,128,freezing drizzle,冻毛毛雨,119,drizzle,毛毛雨,1110,freezing rain,冻雨,1111,showers,阵雨,1112,showers,阵雨,1113,snow flurries,小雪,1314,light snow showers,阵雪,1315,blowing snow,飞雪,1316,snow,雪,1417,hail,冰雹,1518,sleet,雨雪,1219,dust,灰尘,520,foggy,雾,721,haze,薄雾,722,smoky,烟雾弥漫,623,blustery,大风,324,windy,风,425,cold,冷,1826,cloudy,多云,827,mostly cloudy (night),满云密布,828,mostly cloudy (day),满云密布,829,partly cloudy (night),少云,930,partly cloudy (day),少云,931,clear (night),晴,1032,sunny,睛,1033,fair (night),晴,1034,fair (day),晴,1035,mixed rain and hail,大雨和冰雹,1636,hot,热,137,isolated thunderstorms,局部雷雨,1138,scattered thunderstorms,零星雷雨,1139,scattered thunderstorms,零星雷雨,1140,scattered showers,零星阵雨,1141,heavy snow,大雪,1442,scattered snow showers,零星阵雪,1343,heavy snow,大雪,1444,partly cloudy,少云,945,thundershowers,雷阵雨,1146,snow showers,阵雪,1347,isolated thundershowers,局部雷雨,113200,not available,无数据,19

字段解释:code,源数据天气特征代码

en,英文描述

zh,中文描述

type,分类代码

lablecode.csv文件。

'type','alias'1,热2,风暴3,大风4,微风5,灰尘6,大雾7,薄雾8,多云9,少云10,晴11,阵雨12,雨加雪13,小雪14,大雪15,冰雹16,大雨17,雷暴雨18,冷19,无数据

字段解释:type,分类代码

alias,用于显示的别名

有了天气特征定义后,我们再把特征匹配到不同的颜色,并增加图例及文字描述,就生成了最终的中国各省天气概况的静态图片了。

> library('RColorBrewer')> getColors2-function(map,prov,ctype){+>-read.csv(file='adcode99.csv',header=true,fileencoding='utf-8',>-function(x){adcode99$adcode99[which(x==adcode99$prov)]}+> summary-function(data=data,output=false,path=''){+>-c(rev(brewer.pal(9,'blues')),rev(c('#b80137','#8c0287','#d93c5d','#d98698','#f6b400','#c4c4a7','#d6d6cb','#d1b747','#ffeda0')))>-data$code+>-'中国各省天气概况'+>-paste(format(date,'%y%m%d'),'_code.png',sep='')+>-''+>-rev(colors)+>-read.csv(file='code.csv',header=true,fileencoding='utf-8',>-read.csv(file='labelcode.csv',header=true,fileencoding='utf-8',>-sapply(temp,function(x){code$type[which(x==code$code)]})++>-as.character(data$zh[row])+>-labelcode$alias[labelcode$type==ctype[row]]+>-ceiling(row>-ifelse(row%%7==0,7,row%%7)+>-ctype[row]+>-'#000000'+><>=12)fontCol-tail(colors,1)+>-head(colors,1)+>-sapply(prov,fc)+>

运行程序,生成静态图片。

> data path='' # 定义输出路径> summary(data,output=TRUE,path=path) # 生成中国各省天气概况图RStudioGD 2-read.csv(file=filename(date),header=true,fileencoding='utf-8',>

代码量大概100行左右,就可以生成这么复杂的天气和地图结合的图片,R真的很神奇!

3.5 可交互的静态图

这是锦上添花的一步,静态图片对于一般应用来说就够了。但如果图片还能动起来,是不是会更吸引人呢?我们可以尝试生成基于HTML5的、有动态效果的图,通过recharts包调Echarts库实现基于HTML5的动画,生成会动的可交互的图片。

由于recharts包没有发布的CRAN,我们需要用devtools包通过Github安装这个包。

> library(devtools) # 加载devtools> install_github('taiyun/recharts') # 下载安装recharts包> library(recharts) # 加载recharts包

由于上面的天气概况是由离散值组成的,利用echarts的库,我们做一个连续值的可视化例子,比如白天气温和夜间气温。定义weather_html()函数,提供气温数据并调用recharts包,实现可视化的输出。

> weather_html-function(data=data,type='high',output=false,path=''){>-data[,c('prov','high')]+>-c('prov','气温')+>-paste(format(date,'%y-%m-%d'),'中国各省白天气温',sep='')+>-paste(format(date,'%y%m%d'),'_day.html',sep='')+>-data[,c('prov','low')]+>-c('prov','气温')+>-paste(format(date,'%y-%m-%d'),'中国各省夜间气温',sep='')+>-paste(format(date,'%y%m%d'),'_night.html',sep='')+>-substr(df[,1],0,2)>-'黑龙江'+>-'内蒙古'++>->-null+>

运行程序,以HTML输出中国各省白天气温。

> date data path='' # 设置文件输出路径> weather_html(data,type='high',output=FALSE,path='') # 输出中国各省白天气温[1] '气温'[1] 'chart path C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\RtmpqCHFPY'-read.csv(file=filename(date),header=true,fileencoding='utf-8',>-as.date('20141001',format='%y%m%d')>

程序会自动打开浏览器,呈现HTML的网页。

运行程序,以HTML输出中国各省夜间气温。在网页中,通过鼠标对地图进行交互,移动左下角的温度条,选择最高温度30,最低温度8.8,中国地图中由西南到东北变为灰色,说明这些地区的温度不在8.8到30度之间。当鼠标路过海南省的时候,海南省呈现黄色,并提示出温度为23度。

> weather_html(data,type='low', output=FALSE,path='') # 中国各省夜间气温[1] '气温'[1] 'chart path C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\RtmpqCHFPY'

如果不需要在浏览器中打开,只能想存储生成的网页,可以在程序中设置output为TRUE,当前目录下会生成20141001_night.html的文件。

> weather_html(data,type='low',output=TRUE,path='')[1] '气温'

本文介绍了每日中国天气应用项目完整情况,并完成R语言部分的功能实现。那么下一篇文章,将介绍如何把R语言的功能代码封装成R包。

php开发天气可视化,R语言天气可视化应用 | 粉丝日志相关推荐

  1. 20180402-D · US Tuition Costs · ggplot2 geofacet 按地理位置分面的数据可视化 · R 语言数据可视化 案例 源码

    所有作品合集传送门: Tidy Tuesday 2018 年合集传送门: 2018 US Tuition Costs Average Tuition and Educational Attainmen ...

  2. R语言天气可视化应用

    R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可 ...

  3. R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介

    R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介 分层语法的组成(data-stat-geom-scale-coord-facet) 用分层 ...

  4. r语言liftchart_最棒的7种R语言数据可视化

    随着数据量不断增加,抛开可视化技术讲故事是不可能的.数据可视化是一门将数字转化为有用知识的艺术. R语言编程提供一套建立可视化和展现数据的内置函数和库,让你学习这门艺术.在可视化的技术实现之前,让我们 ...

  5. 推荐:一本“高颜值”的R语言数据可视化图书(包邮送3本)

    文章留言点赞前3名的朋友,每人送1本<R语言数据化可视化之美增强版>,名单揭晓日期为:本周日 (2020年7月12日晚7点).到时,获奖的朋友可以直接添加微信:meta-genomics, ...

  6. 半折预售:新书-R语言数据可视化之美|ggplot2作者推荐

    我本来想等正式发售的时候,再告诉大家我的新书<R语言数据可视化之美>已经出版,奈何新书还太贵,这几天刚好京东有买100减50的活动,所以想想还是赶紧告诉大家吧,不然平时购买的话,太真有点小 ...

  7. R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小)

    R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_circle函数在数据簇或数据分组的数据点周围添加圆圈进行注释(自定义圆圈的大小) 目录

  8. R语言ggplot2可视化:ggplot2可视化时间序列数据并在末尾数据点添加数值标签(number label)

    R语言ggplot2可视化:ggplot2可视化时间序列数据并在末尾数据点添加数值标签(number label) 目录

  9. R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加分组显著性(significance)标签

    R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加分组显著性(significance)标签 目录 R语言ggplot2可视化箱图(boxplot)并使用ggsignif添加显 ...

最新文章

  1. 用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%
  2. 华裔教授教你写论文2.引言的逻辑解析
  3. 《预训练周刊》第15期:Bengio, Lecun, Hinton | 人工智能深度学习、用于图像分类的全局过滤网络...
  4. 从实例入手学习Shiro与Web的整合
  5. 虚拟机上的Ubuntu如何无线上网
  6. 想拿下互联网大厂OFFER,都需要准备什么?
  7. 联机装箱问题 java_Java实现 洛谷 P1049 装箱问题
  8. jmeter难吗_Jmeter集成Jira提交缺陷
  9. 如果今天完成,ESB会是什么样子?
  10. 解决: bash: unzip: command not found、linux 安装 zip 命令
  11. 【ES6-11(2015-2020)】特性总览与开发环境准备
  12. a标签position为absolute时,IE无法点击(a position:absolute bug ie)
  13. Spring JDBC和JdbcTemplate CRUD与DataSource示例
  14. springboot socket服务端_SpringBoot2.x系列教程81--SpringBoot中整合WebSockets
  15. 面对imbalance data的时候
  16. TCP/IP及内核参数优化调优(转)
  17. MetaMask发布自定义网络API,允许开发人员为其用户提供多链服务
  18. php curl keep alive,php curl 保持长连接
  19. 成都东软学院php期末考试题,求大神。。。C语言期末项目答案。。。题在一楼。。。...
  20. UVA - 10298 后缀数组(仅观赏)

热门文章

  1. 朝向look at和lookRotation
  2. TPS,MIS,DSS,ESS,临时表
  3. 精品电子书分享 – 《JavaScript Enlightenment.PDF》
  4. 股市入门基础 :基本术语和概念的解读
  5. 微信公众平台开发(110) 微信连Wi-Fi
  6. vivo手机的坑-禁止微信浏览器网页点击图片,图片会自动放大
  7. 微信小程序上传图片后 开发者工具自动刷新问题
  8. 在IPCAM上实现RTSP协议直播-live555
  9. [WinError 2] 系统找不到指定的文件
  10. 圣诞颂歌(Christmas Songs)