国产性生交xxxxx免费-国产中文字幕-啊灬啊灬啊灬快灬高潮了,亚洲国产午夜精品理论片在线播放 ,亚洲欧洲日本无在线码,色爽交视频免费观看

鍋爐信息網 > 鍋爐知識 > 鍋爐百科

R語言天氣可視化應用

發布時間:

前言在很多人看來,R語言還只是個玩具,完全不具備企業級應用的能力。說這些話的人,根本就不了解R語言,更不清楚如何做企業級應用開發。

前言

在很多人看來,R語言還只是個玩具,完全不具備企業級應用的能力。說這些話的人,根本就不了解R語言,更不清楚如何做企業級應用開發。從我最早接觸R語言時,就把R做為可視化引擎嵌入到了曬粉絲的微博應用中;后來又開發了數據挖掘算法競賽網站,并把R語言做為算法引擎,并支持在線編程及運行;我做的第三個R語言應用就是本文要給大家分享的每日中國天氣微博應用,這次同樣是把R做為可視化引擎,并讓R完成爬蟲、XML文檔解析及數據處理等的任務;當然,我還實現了第四個、第五個、第六個以R為核心的應用,都是量化投資方面的,會在下一本書《R的極客理想-量化投資篇》再介紹給大家。

從我的使用經驗來看,R語言已經具備了企業級應用的能力,但我并不是要用R語言完成所有編程任務。在我的項目環境中,大都是多種編程語言配合使用的,只有發揮各自語言的特性優勢,才是未來的發展方向。

本文所介紹的每日中國天氣微博應用開發,將分為3篇介紹R語言和PHP語言的混合編程,第一篇為R語言功能實現,第二篇為R包開發,第三篇為用PHP構建微博應用。本文是第一篇。

目錄

  1. 項目介紹
  2. 系統架構設計
  3. R語言程序現實

1. 項目介紹

談到多語言混編,同如在計算機領域跨學科一樣,是我所一直倡導一種工作模式。當編程語言百花齊放,各種細分市場的小眾語言如雨后春筍般地成長起來,比起通用型編程語言來說,這些小眾語言在特定的領域中有著非常明顯的優勢。 比如統計應用,如果用Java寫個邏輯回歸程序感覺深不見底,而用R語言實現邏輯回歸就是個很平常的一件事情。 再比如做一個Web網站,用PHP或Nodejs實現輕而易舉,如果用Java做不僅代碼量大,而且程序復雜。 所以,對于一個應用來說,一種通用的語言并不一定是最好的解決方案,如果能實現多種語言的結合,那么你做出來的應用可以很酷,很不一樣!

對于本文要介紹的 每日中國天氣 這個新浪微博應用,就是一種多語言混編的實現。

項目介紹

這個項目的出發點很簡單,就是通過可視化技術,展示中國每個省份的天氣情況,給準備旅游的朋友,提供一種出行的提示。

要做實現這個應用,我們首先要列出,要實現哪些功能,會遇到哪些問題等。

  • 天氣數據:數據從哪里找到,如何下載,如何存儲。
  • 定時任務:天氣數據需要每日更新,圖片需要每日新生成。
  • 地圖和天氣可視化:要把中國行政區圖和天氣數據結合在一起畫圖,讓用戶一眼就能看明白。
  • Web展示:通過可視化技術,我們生成的只是一張靜態圖片,如何發布到Web端進行展示。
  • 微博:通過結合新浪微博,讓更多的用戶看到并使用這個應用。
  • 用戶交互:用戶可以查看不同日期、不同類型的圖片,用戶還可以通過微博分享。
  • 雖然是個很小的應用,但五臟俱全,我們也需要完整的思考,如何才能實現這個應用呢!

2. 系統架構設計

從上面的功能描述中,單獨使用一種語言也可以實現的。 如果單獨用PHP開發,做一個Web網站非常容易,連接新浪微博也有現成的SDK可以調用,爬取數據及存儲也不麻煩,那么如何實現地圖和天氣數據的可視化,似乎就是卡在這里了。 如果單獨用R開發,爬取數據及存儲同樣很容易實現,地圖和天氣數據的可視化也是很方便就能畫出來,但是用R做Web網站,那就會遇到很大的瓶頸了,因為R是單線程同步的計算模型,Web應用的高并發特點,會直接讓R程序崩潰的。 所以,綜合上面的問題,如果R語言和PHP語言能結合在一起使用,不僅能避開每種語言不擅長的地方,還能在擅長的領域發揮出每種語言的特性,我們將通過多語言的混編技術做出很不一樣的應用來。

為了實現應用的功能需求,我們要設計一套系統架構。

系統架構解釋:

  • 通過定時器啟動爬蟲程序,到Yahoo的天氣數據源下載數據。
  • 爬蟲下載數據到本地服務器進行解析,存儲應用相關的數據到CSV文件。
  • 可視化程序,讀入天氣數據及地圖數據,生成靜態的圖片作為可視化輸出。
  • 最終用戶通過新浪微博,加載Web應用,看到了可視化生成的靜態圖片。
  • 最終用戶通過新浪微博分享了這個應用,讓更多的人看到這個應用。

下面按照語言的優勢,把應用架構以語言的特性來劃分,讓R語言實現爬蟲、處理數據和可視化,讓PHP完成Web開發、新浪API接入和用戶交互。


由于我們這個應用,不需要讓R和PHP直接進行通信,那么復雜度就會變得小很多了,像我之前做的曬粉絲應用,是3種語言的結合包括了R, PHP, Java,通過Java實現中間程序的調度,讓R和PHP能夠實現通信。

我們通過語言的劃分,就可以揚長避短,讓每種語言在最擅長的領域,完成最擅長的事情。

對于后臺技術應用,定時器可以用Linux系統的CRON實現;然后用R語言程序來爬取數據,通過RCurl包來完成;爬取后的數據為XML格式,再通過R語言用XML包進行解析,以CSV格式進行本地存儲;接下來,再用R語言處理數據,加載地圖包ggmap、mapdata、maptools,最后配合plot()函數實現圖片的輸出,保存在本地服務器上。

對于前端的PHP應用來說,用PHP做一個Web網站很簡單,使用YII快速開發框架;用PHP的新浪微博SDK進行API操作,實現新浪登陸,新浪分享等功能;最后Nginx + Spawn構建出PHP運行時環境,讓Nginx完成負載均衡和圖片加載,并配合PHP的訪問規則,實現功能的切換。

合理的架構設計加上適應的語言的分工,就能輕松實現了 每日中國天氣 這樣的一個微博應用。其實,我們可以用這種多語言混搭的方式,創建出各種創新型的網站應用,但前提是先能掌握多種語言。

這里我想再多說一句,通常我認識的程序員,都是在自己的技術領域中無限暢快,一旦他們掌握了一種語言的核心技術,并有了一些開發經驗后,往往不愿意再去學第二種語言。 對這些人來說,總覺得自己就是世界的中心,自己有能力實現的所有的功能。這些也都是有理想的程序員,只不過他們進入了一個誤區,被現有的技術給迷住了,看不到、也不愿意看到外面的世界已經變了。我曾經就是這樣的!

我承認Java是一種無所不能的編程語言,但是如果你所有程序都用Java實現,難道不覺得又費時又費力嗎?通用性越強,反而專有領域的應用性就越差。這也是我從Java單一的技術路線走出來的原因。其實,在精通一門語言后,再去學習另外一門新的語言,就不是那么難了。但如果只是沉醉于已掌握的技術,很快就會被一代新人,一代新工具所超越的。

3. R語言程序現實

下面就開始介紹R語言的部分程序開發,在寫代碼之前,我們需要先梳理開發流程,做一下程序設計,R語言都需要實現哪些功能,用到哪些第三方R包。


我用一幅圖來說明程序之間的調用關系,R語言的程序實現一共包括了6個部分,爬蟲程序、本地存儲,地圖加載、數據可視化處理、生成靜態圖、生成可交互的靜態圖。

上圖中,分別標出了每個步驟用的到R包或者功能函數,同時我們可以按照這個流程來定義功能函數,這樣我們就把整個應用程序都規劃好,最后再對應的寫代碼就不難了。

3.1 爬蟲部分

對于爬蟲部分來說,就是定時下載每個城市的或地區的天氣數據,并解析數據,只保留我們需要的字段,并以CSV的格式存儲?;ヂ摼W上有很多免費公開的天氣數據源,對我來說,最方便的數據源有2個,一個是Yahoo的天氣數據,另一個Google的天氣數據,但由于Google的API從中國大陸會經常會訪問不到,所以我在這里選擇Yahoo的天氣數據源進行訪問。

yahoo天氣數據源的訪問地址,如下所示。

http://weather.yahooapis.com/forecastrss?w=WOEID

其中WOEID代表城市對應的代碼,如果想查看北京的天氣數據,北京對應的WOEID為2151330,可以訪問用瀏覽器訪問 http://weather.yahooapis.com/forecastrss?w=2151330 。


我們通過瀏覽器打開地址,就可以看到這個數據,數據是以XML格式進行發布的。

我們要解析這個XML文件,從中找到我們需要數據進行提鄧。在R語言中,通過RCurl包實現HTTP的網絡訪問,抓取到整個的XML文檔數據,然后通過XML包解析XML文檔的DOM樹,就能找到我們需要的數據了。

本文的系統環境

  • Win7 64bit
  • R: 3.1.1 x86_64-w64-mingw32/x64 (64-bit)

當我們把業務邏輯和技術實現都想清楚了,就可以動手寫代碼了,只十幾行代碼就能完成爬蟲和XML文檔解析的功能。

> library(RCurl) # 加載類庫n> library(XML)n>n> getWeather<-function (x){n+ url<-paste('http://weather.yahooapis.com/forecastrss?w=',x,'&u=c',sep="") # yahoo的數據源地址n+ doc = xmlTreeParse(getURL(url),useInternal = TRUE) # 解析XML文檔n+n+ ans<-getNodeSet(doc, "//yweather:atmosphere")n+ humidity<-as.numeric(sapply(ans, xmlGetAttr, "humidity")) # 溫度n+ visibility<-as.numeric(sapply(ans, xmlGetAttr, "visibility")) # 能見度n+ pressure<-as.numeric(sapply(ans, xmlGetAttr, "pressure")) # 氣壓n+ rising<-as.numeric(sapply(ans, xmlGetAttr, "rising")) # 氣壓變動n+n+ ans<-getNodeSet(doc, "//item/yweather:condition")n+ code<-sapply(ans, xmlGetAttr, "code") # 天氣情況n+n+ ans<-getNodeSet(doc, "//item/yweather:forecast[1]")n+ low<-as.numeric(sapply(ans, xmlGetAttr, "low")) # 最高氣溫n+ high<-as.numeric(sapply(ans, xmlGetAttr, "high")) # 最低氣溫n+n+ print(paste(x,'==>',low,high,code,humidity,visibility,pressure,rising))n+ cbind(low,high,code,humidity,visibility,pressure,rising) # 以data.frame格式返回n+ }n

運行程序,查看返回結果。

> w<-getWeather(2151330) # 執行爬蟲程序n[1] "2151330 ==> 9 13 21 59 4.1 1016.4 0"nn> w # 返回的結果集n low high code humidity visibility pressure risingn[1,] "9" "13" "21" "59" "4.1" "1016.4" "0"n

對于功能需求來說,一個城市只保存7個字段就行了,其他的XML文檔的數據可以全部過濾掉不管。

3.2 本地存儲

我們通過爬蟲下載并過濾后的數據,已經是data.frame的格式了,通過write.csv()函數就把這些數據輸出到本地文件系統中保存起來,做為數據的備份。

我們在處理本地存儲的過程中,除了要生成一個CSV文件,還包括了 文件命名,把多個城市的數據合并到一個文件存儲的問題。下面我們需要再定義兩個函數,filename()函數用于新生成文件的命名,loadDate()函數用于多個城市數據的加載,合并在一個文件中保存。

城市列表應該是我們需要提單準備好的,我這里只選取了中國的34個城市作為我們要獲得的城市天氣數據的信息。如果想爬取更多的城市天氣數據的信息,那么補充這個列表就行了。

城市列表數據文件WOEID.csv。

beijing,2151330,北京,北京市,116.4666667,39.9nshanghai,2151849,上海,上海市,121.4833333,31.23333333ntianjin,2159908,天津,天津市,117.1833333,39.15nchongqing,20070171,重慶,重慶市,106.5333333,29.53333333nharbin,2141166,哈爾濱,黑龍江省,126.6833333,45.75nchangchun,2137321,長春,吉林省,125.3166667,43.86666667nshenyang,2148332,沈陽,遼寧省,123.4,41.83333333nhohhot,2149760,呼和浩特,內蒙古自治區,111.8,40.81666667nshijiazhuang,2171287,石家莊,河北省,114.4666667,38.03333333nwulumuqi,26198317,烏魯木齊,新疆維吾爾自治區,87.6,43.8nlanzhou,2145605,蘭州,甘肅省,103.8166667,36.05nxining,2138941,西寧,青海省,101.75,36.63333333nxian,2157249,西安,陜西省,108.9,34.26666667nyinchuan,2150551,銀川,寧夏回族自治區,106.2666667,38.33333333nzhengzhou,2172736,鄭州,河南省,113.7,34.8njinan,2168327,濟南,山東省,117,36.63333333ntaiyuan,2154547,太原,山西省,112.5666667,37.86666667nhefei,2127866,合肥,安徽省,117.3,31.85nwuhan,2163866,武漢,湖北省,114.35,30.61666667nchangsha,26198213,長沙,湖南省,113,28.18333333nnanjing,2137081,南京,江蘇省,118.8333333,32.03333333nchengdu,2158433,成都,四川省,104.0833333,30.65nguiyang,2146703,貴陽,貴州省,106.7,26.58333333nkunming,2160693,昆明,云南省,102.6833333,25nnanning,2166473,南寧,廣西壯族自治區,108.3333333,22.8nlasa,26198235,拉薩,西藏自治區,91.16666667,29.66666667nhangzhou,2132574,杭州,浙江省,120.15,30.23333333nnanchang,26198151,南昌,江西省,115.8666667,28.68333333nguangzhou,2161838,廣州,廣東省,113.25,23.13333333nfuzhou,2139963,福州,福建省,119.3,26.08333333ntaipei,2306179,臺北,臺灣省,121.5166667,25.05nhaikou,2162779,???海南省,110.3333333,20.03333333nhongkong,24865698,香港,香港特別行政區,114.1666667,22.3nmacau,20070017,澳門,澳門特別行政區,113.5,22.2n

字段解釋:

  • 第一列,城市的英文名
  • 第二列,WOEID代碼
  • 第三列,城市的中文名
  • 第四列,城市所在的省中文名
  • 第五列,經度(默認為東經)
  • 第六列,緯度(默認為北緯)
    • 用于生成數據文件的R語言的函數實現。

> filename<-function(date=Sys.time()){ # 文件根據日期來命名n+ paste(format(date, "%Y%m%d"),".csv",sep="")n+ }nn> loadDate<-function(date){ # 讀取城市列表,調用爬蟲函數,合并數據保存到一個文件中。n+ print(paste('Date','==>',date))n+ city<-read.csv(file="WOEID.csv",header=FALSE,fileEncoding="utf-8", encoding="utf-8") # 加載城市列表n+ names(city)<-c("en","woeid","zh",'prov','long','lat')n+ city<-city[-nrow(city),]n+n+ wdata<-do.call(rbind, lapply(city$woeid,getWeather))n+ w<-cbind(city,wdata)n+ write.csv(w,file=filename(date),row.names=FALSE,fileEncoding="utf-8")n+ }n

運行程序loadDate()的函數,程序會根據城市列表的數據,調用getWeather()函數自動爬取我們定義的所有城市的天氣數據。

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

程序運行完成后,會在當前目錄生成一個名字為20141001.csv文件。打開20141001.csv文件,這個文件就是接下來用于生成可視化圖片的基礎數據了。

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

數據一共有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)n> library(mapdata)n> library(maptools)nn> map<-readShapePoly('mapdata/bou2_4p.shp') # 加載中國行政區地圖數據n> plot(map) # 畫出中國行政區圖

    是不是很神奇,2行就畫出是中國行政區地圖的輪廓,我們再繼續來分析map這個變量。先檢查一下的map的類型,發現是sp包中定義的SpatialPolygonsDataFrame類型的。

> class(map) # 查看map對象類型n[1] "SpatialPolygonsDataFrame"nattr(,"package")n[1] "sp"n

SpatialPolygonsDataFrame類型我們并不熟悉,再用pryr包的otype查檢一下,面向對象系統的類型。

> library(pryr)n> otype(map) # 發現是S4類型的data.framen[1] "S4"n

R語言基于S4的面向對象編程一文,我們已經掌握了S4類型的基礎知識,在知道map是一個S4類型的實例后,大概就能猜出這個對象如何使用了。另外從命名上看,SpatialPolygonsDataFrame類型,應該是用data.frame存儲了SpatialPolygons的類型的數據。 先通過length()函數和names()函數,從data.frame的角度查看一下map對象,包括7列925行。

> length(map) # 一共有925條記錄n[1] 925nn> names(map) # data.frame包括有7列n[1] "AREA" "PERIMETER" "BOU2_4M_" "BOU2_4M_ID" "ADCODE93"n[6] "ADCODE99" "NAME"n

再通過str()函數查看map對象第一行數據的靜態結構。

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

從這兩個維度的觀察,我們基本清楚map的結構,map里每一行是一個SpatialPolygonsDataFrame對象,包括5個屬性,用于存儲地圖數據信息。取第一行數據data屬性,查看結果,發現是黑龍江省的行政區地圖數據。

> map[1,]@datan AREA PERIMETER BOU2_4M_ BOU2_4M_ID ADCODE93 ADCODE99 NAMEn0 54.447 68.489 2 23 230000 230000 黑龍江省n

用第一行數據畫圖。

> 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"n0,tornado,龍卷風,3n1,tropical storm,熱帶風暴,2n2,hurricane,暴風,3n3,severe thunderstorms,強雷雨天氣,16n4,thunderstorms,雷雨,11n5,mixed rain and snow,雨雪,12n6,mixed rain and sleet,雨雪,12n7,mixed snow and sleet,雨雪,12n8,freezing drizzle,凍毛毛雨,11n9,drizzle,毛毛雨,11n10,freezing rain,凍雨,11n11,showers,陣雨,11n12,showers,陣雨,11n13,snow flurries,小雪,13n14,light snow showers,陣雪,13n15,blowing snow,飛雪,13n16,snow,雪,14n17,hail,冰雹,15n18,sleet,雨雪,12n19,dust,灰塵,5n20,foggy,霧,7n21,haze,薄霧,7n22,smoky,煙霧彌漫,6n23,blustery,大風,3n24,windy,風,4n25,cold,冷,18n26,cloudy,多云,8n27,mostly cloudy (night),滿云密布,8n28,mostly cloudy (day),滿云密布,8n29,partly cloudy (night),少云,9n30,partly cloudy (day),少云,9n31,clear (night),晴,10n32,sunny,睛,10n33,fair (night),晴,10n34,fair (day),晴,10n35,mixed rain and hail,大雨和冰雹,16n36,hot,熱,1n37,isolated thunderstorms,局部雷雨,11n38,scattered thunderstorms,零星雷雨,11n39,scattered thunderstorms,零星雷雨,11n40,scattered showers,零星陣雨,11n41,heavy snow,大雪,14n42,scattered snow showers,零星陣雪,13n43,heavy snow,大雪,14n44,partly cloudy,少云,9n45,thundershowers,雷陣雨,11n46,snow showers,陣雪,13n47,isolated thundershowers,局部雷雨,11n3200,not available,無數據,19n

字段解釋:

  • code,源數據天氣特征代碼
  • en,英文描述
  • zh,中文描述
  • type,分類代碼

lablecode.csv文件。

"type","alias"n1,熱n2,風暴n3,大風n4,微風n5,灰塵n6,大霧n7,薄霧n8,多云n9,少云n10,晴n11,陣雨n12,雨加雪n13,小雪n14,大雪n15,冰雹n16,大雨n17,雷暴雨n18,冷n19,無數據n

字段解釋:

  • type,分類代碼
  • alias,用于顯示的別名

有了天氣特征定義后,我們再把特征匹配到不同的顏色,并增加圖例及文字描述,就生成了最終的中國各省天氣概況的靜態圖片了。

> library("RColorBrewer")n> getColors2<-function(map,prov,ctype){n+ #name change to ADCODE99n+ ADCODE99<-read.csv(file="ADCODE99.csv",header=TRUE,fileEncoding="utf-8", encoding="utf-8")n+ fc<-function(x){ADCODE99$ADCODE99[which(x==ADCODE99$prov)]}n+ code<-sapply(prov,fc)n+ n+ f=function(x,y) ifelse(x %in% y,which(y==x),0);n+ colIndex=sapply(map$ADCODE99,f,code);n+ ctype[which(is.na(ctype))]=19n+ return(ctype[colIndex])n+ }n> summary<-function(data=data,output=FALSE,path=''){n+ colors<-c(rev(brewer.pal(9,"Blues")),rev(c('#b80137','#8c0287','#d93c5d','#d98698','#f6b400','#c4c4a7','#d6d6cb','#d1b747','#ffeda0'))) # 定義18種天氣特征對應的顏色n+n+ temp<-data$coden+ title<-"中國各省天氣概況"n+ ofile<-paste(format(date,"%Y%m%d"),"_code.png",sep="")n+ sign<-''n+ colors<-rev(colors)n+ code<-read.csv(file="code.csv",header=TRUE,fileEncoding="utf-8", encoding="utf-8")n+ labelcode<-read.csv(file="labelcode.csv",header=TRUE,fileEncoding="utf-8", encoding="utf-8")n+ ctype<-sapply(temp,function(x){code$type[which(x==code$code)]})n+n+ if(output)png(file=paste(path,ofile,sep=''),width=600,height=600)n+ layout(matrix(data=c(1,2),nrow=1,ncol=2),widths=c(8,1),heights=c(1,2))n+ par(mar=c(0,0,3,12),oma=c(0.2,0.2,0.2,0.2),mex=0.3)n+ plot(map,border="white",col=colors[getColors2(map,data$prov,ctype)]) # 地圖和天氣可視化n+ points(data$long,data$lat,pch=19,col=rgb(0,0,0,0.3),cex=0.8) # 標出采樣城市n+n+ #======================================= # 圖片中的輔助文字n+ if(FALSE){n+ grid()n+ axis(1,lwd=0);axis(2,lwd=0);axis(3,lwd=0);axis(4,lwd=0)n+ }n+ text(100,58, title,cex=2)n+ text(105,54,format(date,"%Y-%m-%d"))n+ text(98,65,paste('每日中國天氣','http://apps.weibo.com/chinaweatherapp'))n+ text(120,-8,paste('provided by The Weather Channel',format(date, "%Y-%m-%d %H:%M")),cex=0.8)n+n+ #======================================= # 文字說明n+ for(row in 1:nrow(data)){n+ name<-as.character(data$zh[row])n+ label<-labelcode$alias[labelcode$type==ctype[row]]n+ x1<-ceiling(row/7)n+ x2<-ifelse(row%%7==0,7,row%%7)n+ x3<-ctype[row]n+ fontCol<-'#000000'n+ if(x3<=5)fontCol<-head(colors,1)n+ if(x3>=12)fontCol<-tail(colors,1)n+ text(68+x1*11,17-x2*3,paste(name,' ',label,sign,sep=''),col=fontCol)n+ }n+n+ #======================================= # 圖例n+ par(mar = c(5, 0, 15, 10))n+ image(x=1, y=1:length(colors),z=t(matrix(1:length(colors))),col=rev(colors),axes=FALSE,xlab="",ylab="",xaxt="n")n+ axis(4, at = 1:(nrow(labelcode)-1), labels=rev(labelcode$alias)[-1], col = "white", las = 1)n+ abline(h=c(1:(nrow(labelcode)-2)+0.5), col = "white", lwd = 2, xpd = FALSE)n+ if(output)dev.off()n+ }n

運行程序,生成靜態圖片。

> data<-read.csv(file=filename(date),header=TRUE,fileEncoding="utf-8", encoding="utf-8") # 定義數據源n> path='' # 定義輸出路徑n> summary(data,output=TRUE,path=path) # 生成中國各省天氣概況圖nRStudioGDn2


    代碼量大概100行左右,就可以生成這么復雜的天氣和地圖結合的圖片,R真的很神奇!

    3.5 可交互的靜態圖

    這是錦上添花的一步,靜態圖片對于一般應用來說就夠了。但如果圖片還能動起來,是不是會更吸引人呢?我們可以嘗試生成基于HTML5的、有動態效果的圖,通過recharts包調Echarts庫實現基于HTML5的動畫,生成會動的可交互的圖片。

    由于recharts包沒有發布的CRAN,我們需要用devtools包通過Github安裝這個包。

> library(devtools) # 加載devtoolsn> install_github("taiyun/recharts") # 下載安裝recharts包n> library(recharts) # 加載recharts包n

由于上面的天氣概況是由離散值組成的,利用echarts的庫,我們做一個連續值的可視化例子,比如白天氣溫和夜間氣溫。定義weather_html()函數,提供氣溫數據并調用recharts包,實現可視化的輸出。

> weather_html<-function(data=data,type='high',output=FALSE,path=''){ # 輸入HTML的天氣圖n+ if(type=='high') { # 白天氣溫n+ df<-data[,c('prov','high')]n+ names(df)<-c("prov","氣溫")n+ title<-paste(format(date,"%Y-%m-%d"),"中國各省白天氣溫",sep="")n+ ofile<-paste(format(date,"%Y%m%d"),"_day.html",sep="")n+ }else if(type=='low'){ # 夜間氣溫n+ df<-data[,c('prov','low')]n+ names(df)<-c("prov","氣溫")n+ title<-paste(format(date,"%Y-%m-%d"),"中國各省夜間氣溫",sep="")n+ ofile<-paste(format(date,"%Y%m%d"),"_night.html",sep="")n+ }n+n+ df[,1]<-substr(df[,1],0,2) # 數據格式整理n+ df[which(df$prov=='黑龍'),]$prov<-'黑龍江'n+ df[which(df$prov=='內蒙'),]$prov<-'內蒙古'n+n+ recharts.eMap <- eMap(df, namevar=1, datavar = 2, title=title) # 數據JSON化處理n+ if(output){ # 輸出HTML文件n+ recharts.eMap$outList[c('chartid','type')]<-NULLn+ writeLines(unlist(recharts.eMap$outList),paste(path,ofile,sep=''))n+ }else{ # 在瀏覽器中打開HTML網頁n+ plot(recharts.eMap)n+ }n+ }n

運行程序,以HTML輸出中國各省白天氣溫。

> date<-as.Date('20141001',format='%Y%m%d') # 設置日期n> data<-read.csv(file=filename(date),header=TRUE,fileEncoding="utf-8", encoding="utf-8") # 加載數據n> path='' # 設置文件輸出路徑nn> weather_html(data,type='high',output=FALSE,path='') # 輸出中國各省白天氣溫n[1] "氣溫"n[1] "chart path C:UsersADMINI~1AppDataLocalTempRtmpqCHFPY"n

程序會自動打開瀏覽器,呈現HTML的網頁。


      運行程序,以HTML輸出中國各省夜間氣溫。在網頁中,通過鼠標對地圖進行交互,移動左下角的溫度條,選擇最高溫度30,最低溫度8.8,中國地圖中由西南到東北變為灰色,說明這些地區的溫度不在8.8到30度之間。當鼠標路過海南省的時候,海南省呈現黃色,并提示出溫度為23度。

> weather_html(data,type='low', output=FALSE,path='') # 中國各省夜間氣溫n[1] "氣溫"n[1] "chart path C:UsersADMINI~1AppDataLocalTempRtmpqCHFPY"


      如果不需要在瀏覽器中打開,只能想存儲生成的網頁,可以在程序中設置output為TRUE,當前目錄下會生成20141001_night.html的文件。

> weather_html(data,type='low',output=TRUE,path='')n[1] "氣溫"

作者介紹:

張丹,R語言中文社區專欄特邀作者,《R的極客理想》系列圖書作者,民生銀行大數據中心數據分析師,前況客創始人兼CTO。

10年IT編程背景,精通R ,Java, Nodejs 編程,獲得10項SUN及IBM技術認證。豐富的互聯網應用開發架構經驗,金融大數據專家。個人博客 粉絲日志, Alexa全球排名70k。

著有《R的極客理想-工具篇》、《R的極客理想-高級開發篇》,合著《數據實踐之美》,新書《R的極客理想-量化投資篇》(即將出版)。

《R的極客理想-工具篇》京東購買快速通道:《數據分析技術叢書:R的極客理想·工具篇》(張丹 )【摘要 書評 試讀】- 京東圖書

《R的極客理想-高級開發篇》京東購買快速通道:《R的極客理想 高級開發篇》(張丹)【摘要 書評 試讀】- 京東圖書

《數據實踐之美》京東購買快速通道:《數據實踐之美:31位大數據專家的方法、技術與思想》(天善智能)【摘要 書評 試讀】- 京東圖書



大家也可以加小編微信:tswenqu(備注:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流

官方公眾號:R語言中文社區 (ID:R_shequ) 歡迎關注,持續連載。

上一篇:大眾途岳裝R

下一篇:R汽車5

精選推薦

  • 711關東煮供應商
    711關東煮供應商

    今天給大家介紹三位,奶粉,全家、羅森這些便利店里關東煮的供應商。店里賣三四塊錢一串的關東煮,在網上買不到,一塊錢就搞定。首先關東

  • 健康日歷|高壓鍋容易爆炸的4個原因
    健康日歷|高壓鍋容易爆炸的4個原因

    來源:醫藥養生保健報設計:李雅琴醫學審核:姜峰出品人:胡麗麗

  • 高爐
    高爐

    今天這活卻是個白事,等到了時辰,那家人便準備火化,本來準備送普爐,我卻心中一動,便對那家人說道:“這老人走也不要省,還是送高爐吧?!?/p>

  • 高壓鍋和電壓力鍋的區別,推薦幾款點壓力鍋
    高壓鍋和電壓力鍋的區別,推薦幾款點壓

    記得之前有一次去朋友家玩,他正在用高壓鍋煮小米粥,是的,高壓鍋壓小米粥,大概煮了半小時,高壓鍋突然爆炸了,現場慘不忍睹啊,幸好廚房里沒

0