R

GGPLOT2 - geom_map (한국 지도 그림 그리기)

쿠키아버님 2022. 1. 8. 22:56

먼저, 대한민국의 행정구역에 대한 공간 데이터를 다운받는다 

(필요한 파일은 TL_SCCO_CTPRVN.shp) (17개 행정구역별 그림을 그려야 하는 상황이었기 때문에 이 파일만 사용)

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

 

 

지도 그림을 그리기 위해서는 sf 패키지가 필요하다.

library(ggplot2)
library(sf)

 

map_korea <- st_read('TL_SCCO_CTPRVN.shp') #지도 데이터 읽기

#행정 구역 데이터를 UTF-8로 변환하여 읽기
map_korea$CTPRVN_CD <- iconv(map_korea$CTPRVN_CD, 
                             from='CP949',
                             to='UTF-8', 
                             sub=NA,
                             mark=TRUE,
                             toRaw=FALSE)

#원본 데이터를 sp 데이터로 변환 및 정리
map_korea_shp <-  as(map_korea, 'Spatial')

map_korea_df <- fortify(map_korea_shp)
> head(map_korea_df)
     long     lat order  hole piece id group
1 1091705 2034023     1 FALSE     1  1   1.1
2 1091705 2034038     2 FALSE     1  1   1.1
3 1091656 2034038     3 FALSE     1  1   1.1
4 1091616 2034059     4 FALSE     1  1   1.1
5 1091570 2034089     5 FALSE     1  1   1.1
6 1091550 2034094     6 FALSE     1  1   1.1

그림에 그릴 때 사용할 데이터의 형태는 위와 같다.

 

long과 lat은 경도, 위도를 의미하며,

 

id는 1부터 17까지의 값으로 이루어져 있다. (행정 구역 구분용)

 

> unique(map_korea_df$id)
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"
[16] "16" "17"

 

위 데이터와 geom_map을 사용하여 그림 그리기

 

ggplot(data=map_korea_df, 
       aes(x = long, 
           y = lat)) +
  geom_map(map = map_korea_df, 
           aes(map_id = id))

 

나의 경우 각 행정구역 별로 데이터에 맞는 히트맵으로 그려야 했으며,

 

경계선 등 여러가지 커스터마이징을 추가함

 

아래는 예시 코드

 

Heatmap_data = data.frame(Value=runif(17))

df_Heatmap = data.frame(id=as.character(1:17),
                      value=Heatmap_data$Value)

#데이터 결합
map_korea_df_heatmap = map_korea_df%>%left_join(df_Heatmap,by="id")

 

 

ggplot(data=map_korea_df_heatmap, 
       aes(x = long, 
           y = lat)) +
  geom_map(map = map_korea_df_heatmap, 
           aes(fill=value, map_id = id)) +
  #히트맵 색상 지정
  scale_fill_gradientn(colors=brewer.pal(9,"OrRd"),
                       limits=c(0, max(Heatmap_data$Value)))+
  geom_polygon(aes(x=long,
                   y=lat,
                   group=group,
                   color=id), 
               fill = NA, 
               colour = 'black')+
  #여러가지 커스터마이징
  theme(panel.background = element_blank(),
        axis.text=element_blank(),
        legend.title=element_blank(),
        legend.text = element_text(size=20),
        axis.ticks = element_blank(),
        legend.position = "top",
        legend.direction = "horizontal",
        legend.key.width = unit(125, "pt"))+
  labs(x=NULL,
       y=NULL)