iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 21
1
Big Data

R語言與機器學習見面會系列 第 21

Day21 R語言地圖(Map)與網路圖(Network Graph)

趁著被女兒吵醒睡不著,來趕今天的鐵人文。
本來今天打定想寫的主題是網路圖(Network Graph),但昨天的散佈圖(Scattper Plot)想繼續和地圖(map)結合在一起,不忍心拆散他們,於是今天前半篇先讓她們過著幸福快樂的日子,後半篇再來迎接網路圖。

想像一下,如果我們有許多國家邊界的地理資訊,試著先在圖上利用路徑劃出地圖,x軸是經度(Longitude),y軸是緯度(Latitude),然後把想要去的城市點撒在地圖上分佈,好!我們來複習R語言的maps套件。

地圖(Map)


首先我們先載入套件ggplot2maps,並且觀察一下前5筆地圖資料。

#載入maps及ggplot2套件
library(maps) 
library(ggplot2)

#載入世界地圖二維地圖(Latitude緯度,Longitude經度)
world_map <- map_data("world")
head(world_map, 5)

http://ithelp.ithome.com.tw/upload/images/20161221/20103434kqij9G5umq.png

每個國家地圖邊界的經緯度資料,大概有個99,338筆邊界資料。

#找出區域
sort(unique(world_map$region))

http://ithelp.ithome.com.tw/upload/images/20161221/20103434DTdguw8Dgd.png

輸入一下老婆想要旅行的歐洲國家,然後利用指定國家的邊界經緯度劃出幾個國家的地圖。

#旅行國家
mycountry <- c("France", "Austria", "Italy", "Switzerland", "Germany", "Spain", "Czech Republic")
honeymoon <- map_data("world", region = mycountry)

p <- ggplot(honeymoon, aes(x = long, y = lat, group = group, fill = region)) + 
geom_polygon(colour = "black") + 
scale_fill_brewer(palette = "Set2")
p

http://ithelp.ithome.com.tw/upload/images/20161221/20103434qjUmMVaTa1.png

用城市經緯度來畫點


決定好國家後,來試算一下老婆想要去的城市,符合以下任一條件:

  • 首都
  • 人口 > 100萬人
#載入世界城市的經緯度(二維地圖)
data(world.cities)

mycity <- subset(world.cities, (world.cities$capital == 1 | world.cities$pop > 1000000) & world.cities$country.etc %in% mycountry)
mycity$region <- mycity$country.etc
mycity$group <- 1
mycity

http://ithelp.ithome.com.tw/upload/images/20161221/20103434KcyiStR3RA.png

加上旅行城市的點圖,然後人口越多點越大(size=pop)。

p + 
geom_point(aes(x = long, y = lat, size = pop), data = mycity, alpha = .7) 

http://ithelp.ithome.com.tw/upload/images/20161221/20103434TlNnTVHILh.png

加上旅行城市的名稱,位置放在城市點-0.5緯度

p +
geom_point(aes(x = long, y = lat, size = pop), data = mycity, alpha = .7) +
geom_text(aes(x = long, y = lat - 0.5, label = name), data = mycity, colour = "black", fontface = "bold")

http://ithelp.ithome.com.tw/upload/images/20161221/20103434jXGvwpCgiG.png

網路圖


回到今天的主題,網路圖(Network Graph)
網路可以表現階層上的關係,通常程式初學時,也很常用遞迴的方式跑出階層,這邊我們會用另外一個R語言套件iGraph來複習網路圖形呈現。

我們在資料夾MyR新增一支Day21.R

http://ithelp.ithome.com.tw/upload/images/20161221/20103434aOy6QL10j7.png

在Day21.R中輸入程式碼

#載入igraph套件 
library(igraph)  
#新的航線 
flightSchedule <- data.frame( 
   from = c("台北", "台中", "高雄", "台東", "台東"), 
   to   = c("台中", "高雄", "台東", "綠島", "台北")) 
#print(flightSchedule) 
 
gd <- graph.data.frame(flightSchedule) 
plot(gd, layout = layout.fruchterman.reingold) 

http://ithelp.ithome.com.tw/upload/images/20161221/20103434NJsT3Qf89j.png

另外一種寫法

#偶數個數(兩兩成對)
line <- c("台北", "台中", "台中", "高雄", "高雄", "台東", "台東", "綠島", "台東", "台北")
gd <- graph(line)
plot(gd, layout = layout.fruchterman.reingold)

試試看沒有方向的連接線。

#一般網路圖
gu <- graph(line, directed = FALSE)
plot(gu, layout = layout.fruchterman.reingold)

http://ithelp.ithome.com.tw/upload/images/20161221/20103434zVfb6GsZOT.png

表現階層關係


製作一個簡單的階層關係Dataframe,然後用網路圖呈現

Hierarchy <- data.frame(
   name = c("Mike", "Suzie", "James", "Anya", "Jessica", "Benson", "Kyle", "John", "kaven", "Alston", "Ivy", "MT", "Elvis", "Simon"),
   Reportto = c("Suzie", "James", "Simon", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "Suzie", "James", "James", "Daniel"))

gd <- graph.data.frame(Hierarchy)
plot(gd, layout = layout.fruchterman.reingold)

http://ithelp.ithome.com.tw/upload/images/20161221/20103434dateZxXOSp.png

來試試gcookbook內建的資料集madmen狂人。
madmen有39筆資料 。

#載入gcookbook
library(gcookbook)
madmen

2個資料行:name1及name2。
http://ithelp.ithome.com.tw/upload/images/20161221/20103434EpGbJdr8aP.png

畫看看兩個資料行的網路圖

g <- graph.data.frame(madmen, directed = FALSE)
par(mar = c(0, 0, 0, 0)) # Remove unnecessary margins
plot(g, layout = layout.circle, vertex.size = 8, vertex.label = NA)

http://ithelp.ithome.com.tw/upload/images/20161221/20103434tZs4bzOTRH.png

Day16-21,我們大概花了6天複習了第4個主題:資料視覺化,在當中我們重新認識了幾個R語言常用的圖型及語法使用方式,也許在未來資料分析時,再搭配上重點聚焦及配色,我們也能作出有感染力的數據詮釋。

參考:

http://docs.ggplot2.org/current/geom_polygon.html

http://kateto.net/networks-r-igraph

R Graphics cookbook


威尼斯運河
http://ithelp.ithome.com.tw/upload/images/20161221/20103434FwAn6u01iw.jpg
2011.10攝於 Venice,italy


上一篇
Day20 R語言散佈圖(Scattper Plot)
下一篇
Day22 機器學習見面會
系列文
R語言與機器學習見面會30

1 則留言

0
法蘭克
iT邦新手 5 級 ‧ 2016-12-21 11:08:07

感謝 ^^
受益良多
好好來研究iGraph

哈!謝謝!我也還在學習中。一起加油!
/images/emoticon/emoticon78.gif

我要留言

立即登入留言