R | ggmap | 지도 시각화(3) - polygon

2023. 1. 27. 15:04·R/ggplot2

 

 

저번 지도 시각화(2)에서는 ggmap 패키지를 사용하여

차량 주행 궤적 데이터와 항공노선 데이터를 지도 위에  geom_line, geom_path(ggplot2)로  선(경로)으로 표현하였다.

 

이번 포스팅에서는  ggmap 패키지와 geom_polygon(ggplot2)을 사용하여

시도, 시군구별 shape file과 , 행정구역_시도별 인구수 데이터를 활용해  지도 위에 그려볼 것이다. 

 

 


 

01. 대한민국 지도 폴리곤 시각화 하기 

 

   대한민국 지도를 폴리곤으로 시각화하는 방법은 두 가지이다.

     ①  raster 패키지의 지도 데이터를 사용하여 시각화

     ②  shape file의 지리 정보를 사용하여 시각화 

 

1)  raster 패키지를 사용해 시각화하기 

   대한민국 지도를 시각화 하기 위해서는 대한민국의 시군구 지리정보 데이터가 필요하다.

   이 데이터는 R의 "raster" 패키지로 불러올 수 있다. 

 

library(raster) # 시군구까지 데이터 있음
### 시도 : level=1, 시구군: level=2 / getData() 사용 
### 지도 데이터 다운
korea <- getData('GADM', country='kor', level=1) 
plot(korea)
class(korea) # sp
korea@data   # $ 인덱스 대신 @를 사용

raster 패키지를 로드한 후, getData() 함수를 사용해 지도 데이터를 다운로드할 수 있다. 

R의 내장 함수인 plot()으로 간단하게 대한민국의 지도를 시각화할 수 있고,

R의 데이터프레임에서 열 인덱싱 기호인 '$' 대신 '@'를 사용한다. 

 

 

plot(korea)

 

- 좌표평면 위에 geom_polygon()을 사용해 시각화

ggplot()+geom_polygon(data=korea,
                      aes(x=long, y=lat, group=group),
                      fill='white',
                      color='black') #라인의 색

 

- ggmap을 이용해 지도 위에  geom_polygon()을 사용해 시각화

ggmap(airMap)+
  geom_polygon(data=korea,
               aes(x=long, y=lat, group=group),
               fill='white', color='black', alpha=0.5)

airMap 데이터 프레임은 저번 지도 시각화(2)를 참고하면 됨.

 

 

2)  shape file의 지리 정보를 사용하여 시각화 

 

   shape file은 밑의 사이트에서 다운로드할 수 있다.

   시도, 시군구, 읍면동, 리 단위까지 데이터를 얻을 수 있으며 이번 시각화에서는 시군구 데이터를 사용할 것이다.

 

   http://www.gisdeveloper.co.kr/?p=2332 

 

대한민국 최신 행정구역(SHP) 다운로드 – GIS Developer

 

www.gisdeveloper.co.kr

 

- shape 파일 불러오기

library(sp)
library(rgdal)

### 시도 : shp
### 시군구: SIG.shp

### read shape file
shp.file <- file.choose()
shp <- rgdal::readOGR(shp.file)

- 좌표계 변환 : UTM-K(GRS-80) 좌표계에서 WGS84 경위도 좌표계로 변환

from.crs <- "+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs"
to.crs <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
shp <- spTransform(shp, to.crs) # 좌표계가 올바르게 변함

 

- 좌표평면 위에 geom_polygon()을 사용해 시군구 시각화

ggplot()+geom_polygon(data=shp, 
                      aes(x=long, y=lat, group=group),
                      fill='white',color='black')

 

 

- ggmap을 이용해 지도 위에  geom_polygon()을 사용해  시군구 시각화

ggmap(airMap)+geom_polygon(data=shp, 
                           aes(x=long, y=lat, group=group),
                           fill='white',
                           color='black', alpha=0.5) # 라인의 색

 

 

 

 


 

02.  시도별 인구수 지도 시각화 하기 

 

1)  데이터 불러오기 

      ① KOSIS에서 제공하는 행정구역(시군구) 별, 성별 인구수 데이터

      ② shape file 시도 데이터 

 

- 시도  shp file 불러오기 

### 시도 shp file 
### read shape file
shp.file <- file.choose()
shp <- rgdal::readOGR(shp.file)

### 좌표 확인: UTM-K(GRS-80) 좌표계에서 WGS84 경위도 좌표계로 변환 ####
from.crs <- "+proj=tmerc +lat_0=38 +lon_0=127.5 +k=0.9996 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs"
to.crs <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
shp <- spTransform(shp, to.crs) # 좌표계가 올바르게 변함

 

- shp file 데이터 프레임으로 변환 : fortify() 함수 사용 

## shp 파일을 data.frame으로 만들기 위해서 fortify() 사용
shp.df <- fortify(shp) 
shp.df %>% head(50) # group 같은 지역끼리
                    # order 점을 연결할 순서 -> 다각형

 

 

- 인구수 데이터 불러오기 

pop <- read.csv(file.choose())
pop %>% head()
pop %>% str() # 시도명 CTP_KOR_NM

 

 

2)  데이터 전처리

- 시도 shp file 데이터 프레임과 인구수 데이터 join

shp@data$id <- rownames(shp@data) # shp@data에 id 열 추가하기 
shp.df.use <- left_join(shp.df, shp@data, by='id') #위경도가 포함된 shp.df와 shp@data join
shp.df.use <- shp.df.use[order(shp.df.use$id, shp.df.use$order),]
shp.df.use %>% head(30)

 

- shp.df.use와 인구수 데이터 join 하여 최종 데이터 셋 생성

# 인구수 join 
shp_pop <- left_join(shp.df.use, pop , by ="CTP_KOR_NM") # 시도명 기준으로 left join

위의 데이터 프레임에서 인구수 정보 추가

 

 

 

3)  지도시각화

- 시도별로 색상 달리하여 polygon 시각화(fill = 범주형 변수)

### polygon(시도별로 색상 다르게) : ggplot()+geom_polygon() 
ggplot()+ geom_polygon(data=shp_pop, 
                       aes(x=long, y=lat,group=group,
                          fill=CTP_KOR_NM), 
                       # 시별로 색 달리 fill=CTP_KOR_NM
                       color='black') # 테두리 색

 

ggmap(airMap)+ geom_polygon(data=shp_pop, 
                       aes(x=long, y=lat,group=group,
                          fill=CTP_KOR_NM), 
                       # 시별로 색 달리 fill=CTP_KOR_NM
                       color='black') # 테두리 색

 

 

 

- 인구수에 따라 색상 달리하여 polygon 시각화 (fill = 연속형 변수)

ggplot()+ geom_polygon(data=shp_pop, 
                       aes(x=long, y=lat, group=group,
                           fill=Total), color='black')+ # Total(총인구수)
  scale_fill_continuous(low='yellow', high='red',
                        labels = scales::comma) # 범례 단위 서식 변환

 

 

ggmap(airMap)+ geom_polygon(data=shp_pop, 
                       aes(x=long, y=lat, group=group,
                           fill=Total), color='black')+
  scale_fill_continuous(low='yellow', high='red',
                        labels = scales::comma)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


참고 문헌(reference)

더보기

사용 데이터

시군구 shape file - http://www.gisdeveloper.co.kr/?p=2332 

 

대한민국 최신 행정구역(SHP) 다운로드 – GIS Developer

 

www.gisdeveloper.co.kr

시도별 인구수 - https://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1B040A3 

참고 서적 / 시각화를 이용한 데이터 정보 분석- R 활용(이동수, 장인홍 (지은이) 자유아카데미)

http://www.freeaca.com/new/book/MainBookView.aspx?bookid=30472&page=1&ca1=0&ca2=0&sword=%EC%8B%9C%EA%B0%81%ED%99%94%EB%A5%BC%20%EC%9D%B4%EC%9A%A9%ED%95%9C&stype=subject 

 

자유아카데미 - 도서

정보분석은 다양한 자료를 통해 필요한 가치를 도출시키는 것을 말하며, 이것은 빅데이터에 기반한 4차 산업혁명 시대에 매우 중요한 의미를 지닌다. 다양한 데이터를 바탕으로 도출된 결과는

www.freeaca.com

 

참고 사이트

https://lumiamitie.github.io/r/visualization/ggplot2-scale-label/

 

ggplot2 축 레이블 포맷 바꾸기

Data and Visualization

lumiamitie.github.io

 

 

'R > ggplot2' 카테고리의 다른 글

R | ggmap | 지도 시각화(2) - line  (0) 2023.01.26
R | ggmap | 지도 시각화(1)  (0) 2023.01.25
R | ggplot2 | Text (geom_text)  (0) 2023.01.19
R | ggplot2 | Line Plot  (0) 2023.01.18
R | ggplot2 | Scatter Plot(산점도)  (0) 2023.01.17
'R/ggplot2' 카테고리의 다른 글
  • R | ggmap | 지도 시각화(2) - line
  • R | ggmap | 지도 시각화(1)
  • R | ggplot2 | Text (geom_text)
  • R | ggplot2 | Line Plot
갬보리
갬보리
제발 코드정리좀 하자 (R, SQL, SAS, Python , etc...)
  • 갬보리
    보딩코
    갬보리
  • 전체
    오늘
    어제
    • 분류 전체보기 (49)
      • R (32)
        • dplyr (7)
        • preprocessing (2)
        • EDA (0)
        • ggplot2 (10)
        • plotly (11)
        • leaflet (2)
      • SQL (15)
      • SAS (0)
      • Python (1)
        • preprocessing (0)
        • ML (0)
        • Library (0)
      • ETC (1)
  • hELLO· Designed By정상우.v4.10.3
갬보리
R | ggmap | 지도 시각화(3) - polygon
상단으로

티스토리툴바