지리정보 그래프

maps 패키지

  • 전 세계 나라의 경계선이 입력된 지도 자료이다.

  • 나라의 주별 경계선까지 입력되어 있으나 지도가 1990년 자료를 기준으로 개발되어 업데이트 된 나라와 업데이트 안된 나라가 섞여있다.

  • col과 fill을 통해 나라별 특징을 시각화 하기 좋다.

  • 미국의 경우 state 까지 세분화 하여 시각화가 가능하다.

if (!require(maps)) {
  install.packages("maps",repos = "http://cran.us.r-project.org")
}
## Loading required package: maps
if(!require(ggplot2)) install.packages("ggplot2",repos = "http://cran.us.r-project.org")
## Loading required package: ggplot2
library(ggplot2)

library(maps)
map("italy")
title("databse=\"italy\"")

map("italy", fill=TRUE, col=2:4)
title("fill=T, col=2:4")

# 지역별로 색상을 입력할 경우 지역별 통계를 시각화 할 수 있다. 
# 이경우 cut 함수를 사용하면 좋다.

map("italy", resolution=5)
title("resolution=5")

world <- map_data("world")
italy <- world[grep("Italy$", world$region),]
head(italy, 20)
##           long      lat group order region            subregion
## 53917 12.05127 36.75703   851 53917  Italy Isola di Pantelleria
## 53918 12.00332 36.74600   851 53918  Italy Isola di Pantelleria
## 53919 11.94062 36.78037   851 53919  Italy Isola di Pantelleria
## 53920 11.93643 36.82861   851 53920  Italy Isola di Pantelleria
## 53921 11.94805 36.84307   851 53921  Italy Isola di Pantelleria
## 53922 12.02422 36.82095   851 53922  Italy Isola di Pantelleria
## 53923 12.04805 36.77637   851 53923  Italy Isola di Pantelleria
## 53924 12.05127 36.75703   851 53924  Italy Isola di Pantelleria
## 53926 15.57656 38.22031   852 53926  Italy               Sicily
## 53927 15.50889 38.10664   852 53927  Italy               Sicily
## 53928 15.47568 38.06294   852 53928  Italy               Sicily
## 53929 15.23447 37.78481   852 53929  Italy               Sicily
## 53930 15.20684 37.72056   852 53930  Italy               Sicily
## 53931 15.18984 37.65073   852 53931  Italy               Sicily
## 53932 15.16484 37.58955   852 53932  Italy               Sicily
## 53933 15.13105 37.53189   852 53933  Italy               Sicily
## 53934 15.09951 37.45860   852 53934  Italy               Sicily
## 53935 15.10566 37.37549   852 53935  Italy               Sicily
## 53936 15.11699 37.33472   852 53936  Italy               Sicily
## 53937 15.14600 37.30801   852 53937  Italy               Sicily
unique(italy$subregion)
## [1] "Isola di Pantelleria" "Sicily"               "Sant'Antonio"        
## [4] "Forio"                "Asinara"              "Sardinia"            
## [7] "Isola d'Elba"         NA
map("italy")
polygon(italy$long[italy$subregion=="Sicily"],italy$lat[italy$subregion=="Sicily"], col="red")
map("italy", add=T)

#한국지도 데이터 정보
world <- map_data("world")
korea <- world[grep("Korea$", world$region),]
unique(korea$subregion)
##  [1] "Cheju Do"  "11"        "3"         "21"        "5"        
##  [6] "Namhae Do" "Koje Do"   "8"         "Ullung Do" "10"       
## [11] NA
#한국지도를 그리고 제주도만 회색으로 그려보자. 
map('world','South Korea')
polygon(korea$long[korea$subregion=="Cheju Do"],korea$lat[korea$subregion=="Cheju Do"], col="grey")

country <- map_data("state")
head(country)
##        long      lat group order  region subregion
## 1 -87.46201 30.38968     1     1 alabama      <NA>
## 2 -87.48493 30.37249     1     2 alabama      <NA>
## 3 -87.52503 30.37249     1     3 alabama      <NA>
## 4 -87.53076 30.33239     1     4 alabama      <NA>
## 5 -87.57087 30.32665     1     5 alabama      <NA>
## 6 -87.58806 30.32665     1     6 alabama      <NA>
unique(country$region)
##  [1] "alabama"              "arizona"              "arkansas"            
##  [4] "california"           "colorado"             "connecticut"         
##  [7] "delaware"             "district of columbia" "florida"             
## [10] "georgia"              "idaho"                "illinois"            
## [13] "indiana"              "iowa"                 "kansas"              
## [16] "kentucky"             "louisiana"            "maine"               
## [19] "maryland"             "massachusetts"        "michigan"            
## [22] "minnesota"            "mississippi"          "missouri"            
## [25] "montana"              "nebraska"             "nevada"              
## [28] "new hampshire"        "new jersey"           "new mexico"          
## [31] "new york"             "north carolina"       "north dakota"        
## [34] "ohio"                 "oklahoma"             "oregon"              
## [37] "pennsylvania"         "rhode island"         "south carolina"      
## [40] "south dakota"         "tennessee"            "texas"               
## [43] "utah"                 "vermont"              "virginia"            
## [46] "washington"           "west virginia"        "wisconsin"           
## [49] "wyoming"
NJ <- country[grep("new jersey$", country$region),]

map("state")
polygon(NJ$long, NJ$lat, col="gold")
map.text("state", add=T)

map('county', 'texas')
map.text('county', 'texas',add=T, cex=0.6)

map에 있는 자료만 가지고는 경상북도, 대구광역시에 해당하는 통계를 시각화 하는데 어려움이 있다.

이유 : 지도정보가 제대로 구축되지 있지 않음.

raster 패키지의 getData를 통해 최근자료를 다운 받아서 활용하자.

if (!require(raster)) {
  install.packages("raster",repos = "http://cran.us.r-project.org")
}
## Loading required package: raster
## Loading required package: sp
library(raster)
korea1 <- getData('GADM', country='KOR', level=1)
korea2 <- getData('GADM', country='KOR', level=2)

plot(korea1)

plot(korea2)

korea1@data
##    GID_0      NAME_0    GID_1            NAME_1
## 1    KOR South Korea  KOR.1_1             Busan
## 10   KOR South Korea  KOR.2_1 Chungcheongbuk-do
## 11   KOR South Korea  KOR.3_1 Chungcheongnam-do
## 12   KOR South Korea  KOR.4_1             Daegu
## 13   KOR South Korea  KOR.5_1           Daejeon
## 14   KOR South Korea  KOR.6_1        Gangwon-do
## 15   KOR South Korea  KOR.7_1           Gwangju
## 16   KOR South Korea  KOR.8_1       Gyeonggi-do
## 17   KOR South Korea  KOR.9_1  Gyeongsangbuk-do
## 2    KOR South Korea KOR.10_1  Gyeongsangnam-do
## 3    KOR South Korea KOR.11_1           Incheon
## 4    KOR South Korea KOR.12_1              Jeju
## 5    KOR South Korea KOR.13_1      Jeollabuk-do
## 6    KOR South Korea KOR.14_1      Jeollanam-do
## 7    KOR South Korea KOR.15_1            Sejong
## 8    KOR South Korea KOR.16_1             Seoul
## 9    KOR South Korea KOR.17_1             Ulsan
##                                                                                                  VARNAME_1
## 1                                                          Pusan|Busan Gwang'yeogsi|Pusan-gwangyoksi|Fusan
## 10 Chungchongbuk-Do|Chungcheongbugdo|Ch'ungch'ong-bukto|Chusei Hoku-do|North Chungchong|Ch'ungch'ong-bukto
## 11                   Chungchongnam-Do|Ch'ungch'ong-namdo|Chusei Nan-do|South Chungchong|Ch'ungch'ong-namdo
## 12                                                        Taegu|Daegu Gwang'yeogsi|Taegu-gwangyoksi|Taikyu
## 13                                             Daejeon Gwang'yeogsi|Taej<U+014F>n-gwangy<U+014F>ksi|Taiden
## 14                                               Kang-Won-Do|Gang'weondo|Kangwon-do|Kogen-do|South Kangwon
## 15                                                                              Kwangju|Kwangju-gwangyoksi
## 16                                                                             Kyonggi-do|Keiki-do|Kyunggi
## 17                          Kyongsangbuk-Do|Gyeongsangbugdo|Kyongsang-bukto|Keisho Hoku-do|North Kyongsang
## 2                                            Kyongsangnam-Do|Kyongsang-namdo|Keisho Nan-do|South Kyongsang
## 3                                                                        Inchon|IInch'on-gwangyoksi|Jinsen
## 4                                                                       Jeju-doQuelpart|Saishu-to|Cheju-do
## 5                                         Chollabuk-Do|Cholla-bukto|Jeonrabugdo|North Cholla|Zenra Hoku-do
## 6                                          Chollanam-Do|Cholla-namdo|Jeonranamdo|South Cholla|Zenra Nan-do
## 7                                                                      Sejong Metropolitan Autonomous City
## 8                                                               Keijo|Seoul|Seul|Seul|Soul|Soul-t'ukpyolsi
## 9                                                                                         Ulsan-gwangyoksi
##                          NL_NAME_1            TYPE_1
## 1          부산광역시 | 釜山廣域市       Gwangyeoksi
## 10             충청북도 | 忠淸北道                Do
## 11             충청남도 | 忠淸南道                Do
## 12         대구광역시 | 大邱廣域市       Gwangyeoksi
## 13         대구광역시 | 大邱廣域市      Gwangyeoksi 
## 14                 강원도 | 江原道                Do
## 15         광주광역시 | 光州廣域市       Gwangyeoksi
## 16                 경기도 | 京畿道                Do
## 17             경상북도 | 慶尙北道                Do
## 2              경상남도 | 慶尙南道                Do
## 3          인천광역시 | 仁川廣域市       Gwangyeoksi
## 4  제주특별자치도 | 濟州特別自治道                Do
## 5              전라북도 | 全羅北道                Do
## 6              전라남도 | 全羅南道                Do
## 7                   세종특별자치시                Do
## 8                       서울특별시       Teukbyeolsi
## 9          울산광역시 | 蔚山廣域市 Metropolitan City
##                       ENGTYPE_1 CC_1 HASC_1
## 1             Metropolitan City <NA>  KR.PU
## 10                     Province <NA>  KR.GB
## 11                     Province <NA>  KR.GN
## 12            Metropolitan City <NA>  KR.TG
## 13           Metropolitan City  <NA>  KR.TJ
## 14                     Province <NA>  KR.KW
## 15            Metropolitan City <NA>  KR.KJ
## 16                     Province <NA>  KR.KG
## 17                     Province <NA>  KR.KB
## 2                      Province <NA>  KR.KN
## 3             Metropolitan City <NA>  KR.IN
## 4                      Province <NA>  KR.CJ
## 5                      Province <NA>  KR.CB
## 6                      Province <NA>  KR.CN
## 7  Metropolitan Autonomous City <NA>  KR.SJ
## 8     Capital Metropolitan City <NA>  KR.SO
## 9             Metropolitan City <NA>  KR.UL

Q1. 경상북도와 대구광역시를 빨간색으로 색칠한 그림을 그려라.

여러나라의 시각화

map함수에서 c()함수를 활용하여 여러나라를 선택 후 col을 통해 표현할 있다.

maps 패키지에는 map.cities함수가 있어 나라별 수도와 인구수를 시각화 할 수 있으나

작성된 연도가 현재와 차이가 있으므로 사용을 지양하자.

추가로 map.scale, map.axes 함수가 있다.

map("world", "China")
map.cities(country = "China", capitals = 1)
title("capitals = 1")

map("world", "China")
map.cities(country = "China", capitals = 2)
title("capitals = 2")

map("world", "China")
map.cities(country = "China", capitals = 3, pch=16, col="red", cex=2)
title("capitals = 3")

map("world", "China")
map.cities(country = "China", capitals = 3, minpop = 3500000, maxpop = 5000000)
title("capitals=3, minpop=3500000, maxpop=5000000")

map('world',c('South Korea','North Korea','Japan'))
map.cities(capitals=1)

map("world", "China")
map.scale()
map.axes()

USArrests : 미국 범죄데이터

위의 데이터를 지도로 시각화하여 위험한 지역을 지도로 나타내보자.

본토와 떨어진 하와이와 알라스카는 제외하여 시각화해보자.

# 본토에서 떨어진 Alaska, Hawaii 데이터 제외
sub.usa <- subset(USArrests,!rownames(USArrests) %in% c("Alaska", "Hawaii"))
# 주이름, 폭행범 수를 갖는 데이터 프레임 생성
usa.data <- data.frame(states = rownames(sub.usa), Assault = sub.usa$Assault)

# 범례 데이터 생성
col.level <- cut(sub.usa[, 2], c(0, 100, 150, 200, 250, 300, 350))
legends <- levels(col.level)

# 주이름, 폭행범 수, 색상을 갖는 데이터 프레임 생성
levels(col.level) <- sort(heat.colors(6), decreasing = TRUE)
usa.data <- data.frame(usa.data, col.level = col.level)

# Map 데이터 시각화
map('state', region = usa.data$states, fill = TRUE, col = as.character(usa.data$col.level))
title("USA Assault map")
legend(-76, 35, legends, fill = sort(heat.colors(6), decreasing = TRUE), cex = 0.7)

고용율 지도

if (!require(mapproj)) install.packages('mapproj',repos = "http://cran.us.r-project.org")
## Loading required package: mapproj
library(mapproj)
data(unemp)
data(county.fips)

head(unemp)
##   fips   pop unemp
## 1 1001 23288   9.7
## 2 1003 81706   9.1
## 3 1005  9703  13.4
## 4 1007  8475  12.1
## 5 1009 25306   9.9
## 6 1011  3527  16.4
head(county.fips)
##   fips        polyname
## 1 1001 alabama,autauga
## 2 1003 alabama,baldwin
## 3 1005 alabama,barbour
## 4 1007    alabama,bibb
## 5 1009  alabama,blount
## 6 1011 alabama,bullock
# define color buckets
colors = c("#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043")
unemp$colorBuckets <- as.numeric(cut(unemp$unemp, c(0, 2, 4, 6, 8, 10, 100)))
leg.txt <- c("<2%", "2-4%", "4-6%", "6-8%", "8-10%", ">10%")

newdata <- merge(county.fips, unemp, by="fips")
head(newdata)
##   fips        polyname   pop unemp colorBuckets
## 1 1001 alabama,autauga 23288   9.7            5
## 2 1003 alabama,baldwin 81706   9.1            5
## 3 1005 alabama,barbour  9703  13.4            6
## 4 1007    alabama,bibb  8475  12.1            6
## 5 1009  alabama,blount 25306   9.9            5
## 6 1011 alabama,bullock  3527  16.4            6
# draw map
map("county", col = colors[newdata$colorBuckets], fill = TRUE, resolution = 0, lty = 0, projection = "polyconic")
map("state", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.7, projection="polyconic")
title("unemployment by county, 2009")
legend("bottomright", leg.txt, fill = colors, bty = 'n')

과제 1.

2017년 행정구역별 1인당 지역 내 총생산은 아래 사이트와 같다.

raster에서 시도별 지도다 ㄷ받 ㅂ아 지1인당 지역 총소득을 시각하세요.

단, 세종시는 대전광역시와 지역총소득이 같다고 가정하자.

색 : heat.color를 이용

구분 : 1인당 지역총소득

http://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1C65

과제 2.

아래 사이트는 2018년 한국의 수출입 현황의 통계 자료이다.

수출액에 따른 Top20개 국을 map함수를 이용하여 시각화 하여라.

색 : heat.color를 이용

구분 : 수출액

http://stat.kita.net/stat/world/trade/CtrImpExpList.screen