본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
지도 시각화

지도에 지역 이름 넣기 in R

by 아참형인간 2022. 7. 8.
label.knit

사용데이터 : https://2stndard.tistory.com/107

sf을 사용한 지도 꾸미기

지역이 포함된 데이터를 지도 위에 표현하는 것은 데이터 시각화에서 매우 중요한 시각화중에 하나이다. 하지만 데이터를 표현하는데 몇가지 제약사항이 있어 그 사용에 부담이 있는 것이 사실이다. 그 중에 하나가 지도의 위치에 해당하는 지역을 사용자가 인식하게 만드는 것이다. 우리나라는 17개의 시도로 구분되어 있는데 지도상의 위치를 보면 대략 해당 지역이 어딘지 대부분 알 수 있을 것이다. 하지만 260여개의 시군구 단위로 표현할 떄는 그 위치에 따른 지역을 즉각 알기가 어렵다. 그래서 지도위에 해당 지역 이름을 표시하면 좋겠지만 이를 어떻게 해야할지가 언듯 떠오르는가? 이를 쉽게 표기하는 방법에 대해 알아본다.

지도에 해당 지역 이름을 표기하기 위해서는 해당 지역의 가장 가운데 표기해주는 것이 가장 좋을 것이다. 그렇다면 해당 지역의 가운데 점을 먼저 찾아야 할 것이다. 이를 위해서 sf 패키지의 st_centriod()를 사용할 수 있다. st_centroid()의 결과는 ‘sf’ 클래스의 데이터가 반환되는데 ‘geometry’ 열에 중심점이 sfc_POINT 클래스포 저장된다. 하지만 geom_text()의 X, Y에 매핑하기 위해서는 ‘sfc_POINT’ 클래스의 ’geometry’열의 데이터를 X, Y에 매핑할 수 있는 데이터로 추출해야한다. 이때 사용하는 함수가 st_coordinates()이다.

if (!require(sf)) {
  install.packages('sf')
  library(sf)
}

centroid_shp <- st_centroid(spdf_shp)

centroid_shp |> head()
## Simple feature collection with 6 features and 3 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 939472 ymin: 1684701 xmax: 1112027 ymax: 1969047
## Projected CRS: PCS_ITRF2000_TM
##   CTPRVN_CD       CTP_ENG_NM CTP_KOR_NM                 geometry
## 1        42       Gangwon-do     강원도  POINT (1070808 1969047)
## 2        41      Gyeonggi-do     경기도 POINT (971834.4 1948256)
## 3        48 Gyeongsangnam-do   경상남도  POINT (1069218 1703449)
## 4        47 Gyeongsangbuk-do   경상북도  POINT (1112027 1817405)
## 5        29          Gwangju 광주광역시   POINT (939472 1684701)
## 6        27            Daegu 대구광역시  POINT (1096215 1759774)
st_coordinates(centroid_shp)
##            X       Y
## 1  1070808.5 1969047
## 2   971834.4 1948256
## 3  1069217.9 1703449
## 4  1112027.0 1817405
## 5   939472.0 1684701
## 6  1096215.2 1759774
## 7   990489.4 1815820
## 8  1142039.9 1690714
## 9   955111.6 1950406
## 10  978414.3 1840349
## 11 1157493.1 1730077
## 12  900984.4 1954430
## 13  945193.5 1653619
## 14  967659.5 1746665
## 15  911983.8 1488782
## 16  941837.4 1836960
## 17 1029502.4 1860032

geom_text()의 X, Y에 매핑하기 위해 st_coordinates()를 사용해 추출한 값은 단순 좌표만 있기 떄문에 해당 지역의 중심점 정보가 들어있는 st_centroid()의 결과값에 붙여주면 geom_text()를 사용하여 다음과 같이 지역 중앙에 지역 이름을 표기해 줄 수 있다 .

library(ggspatial)

spdf_shp |> ggplot() + 
  geom_sf(fill = "dodgerblue", color = 'white', show.legend = F) +
  geom_text(data = cbind(centroid_shp, st_coordinates(centroid_shp)), aes(x = X, y = Y, label = CTP_KOR_NM)) + 
  labs(x = '위도', y = '경도') +
  annotation_scale(location = "br") +
  annotation_north_arrow(location = "br", pad_y = unit(0.05, 'npc'),
                         style = north_arrow_nautical)
  theme_bw()

댓글