人口密度の高い箇所を明るくした世界地図を作りたい
前回「地図をいじりたい - My Life as a Mock Quant」の続き
10m-cultural-vectors | Natural Earthにある「Urban Areas」のデータ(人が密集して住んでる都市エリアのデータ)を世界地図の上に重ねてPLOTする方法。
まずは毎度のパッケージのロード。
library(ggplot2) library(maptools) library(rgeos)
それから世界地図データの取得(前回同様)とshape fileのダウンロード・解凍・読み込み。
結構時間がかかるので、お茶でも飲んで待ちましょう。
#世界地図データを取得 world.map <- map_data ("world") #shape fileのダウンロード URL <- 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-urban-area.zip' download.file(URL, destfile='temp.zip') #shape fileをreadShapePoly関数 in maptoolsで読み込んでSpatialPolygonsDataFrameオブジェクトを生成 urbanareasin <- readShapePoly(unzip("temp.zip", files = "10m_urban_areas.shp"))
さらに読み込んだUrban Areasデータの情報を削減。これが体感で一番重くて5分くらいかかります。
#与えられた幾何構造を簡易化(gSimplify関数 in rgeosパッケージ)しつつ、 #fortify関数 in ggplot2でオブジェクトを強制的にデータフレーム化 urbanareas <- fortify(gSimplify(urbanareasin, 20, topologyPreserve=T))
で、最後に描画。これも重い。。。
#最後に描画 urban <- geom_polygon(aes(long,lat,group=group), size = 0.1, colour= "#FCFFF1", fill="#FCFFF1", alpha=1, data=urbanareas) world <- geom_polygon(aes(long,lat,group=group), size = 0.1, colour= "#090D2A", fill="#090D2A", alpha=1, data=world.map) ggplot(world.map, aes(x = long, y = lat)) + world + urban + coord_equal() + opts(panel.background = theme_rect(fill='#00001C',colour='#00001C'))
するとこんな感じで人口密度の高い箇所を明るくした世界地図を作る事が出来る。
地図いじり飽きちゃったので、もうこれでおしまいでいいや・・・後はこの上にソーシャルグラフなんかを乗っけるといい感じのビッグデータ解析になるんだろう。
↓以下全ソース。パッケージをインストールしていればコピペで動くはず。
library(ggplot2) library(maptools) library(rgeos) #世界地図データを取得 world.map <- map_data ("world") #shape fileのダウンロード URL <- 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-urban-area.zip' download.file(URL, destfile='temp.zip') #shape fileをreadShapePoly関数 in maptoolsで読み込んでSpatialPolygonsDataFrameオブジェクトを生成 urbanareasin <- readShapePoly(unzip("temp.zip", files = "10m_urban_areas.shp")) #与えられた幾何構造を簡易化(gSimplify関数 in rgeosパッケージ)しつつ、 #fortify関数 in ggplot2でオブジェクトを強制的にデータフレーム化 urbanareas <-fortify(gSimplify(urbanareasin, 20, topologyPreserve=T)) #最後に描画 urban <- geom_polygon(aes(long,lat,group=group), size = 0.1, colour= "#FCFFF1", fill="#FCFFF1", alpha=1, data=urbanareas) world <- geom_polygon(aes(long,lat,group=group), size = 0.1, colour= "#090D2A", fill="#090D2A", alpha=1, data=world.map) ggplot(world.map, aes(x = long, y = lat)) + world + urban + coord_equal() + opts(panel.background = theme_rect(fill='#00001C',colour='#00001C'))