멀리 떨어진 지역 박스 처리하기
개요
지도 작업 시 서로 멀리 떨어진 지역이 포함되면, 지도의 가로 길이가 길어져 지역 폴리곤이 전반적으로 작아집니다. 예를 들어, 수도권 지도를 그릴 때 옹진군이 포함되면 육지가 지도의 중심에서 비켜나고, 육지에 있는 지역들이 작게 표현되는 상황이 생길 수 있습니다. 이런 경우, 독자가 집중해야 할 주요 영역을 돋보이게 할 필요가 있습니다. 이번 글에서는 이러한 문제를 해결하기 위해 멀리 떨어진 지역을 별도의 박스로 표시하여 메인 지도에 추가하는 방법을 소개하겠습니다.
데이터 준비하기
먼저, 필요한 패키지를 로드합니다. 이번 작업에서는 두 개의 지도를 조합하기 위해 cowplot 패키지가 추가로 필요합니다. 이 패키지를 활용하면 여러 플롯을 하나의 시각화로 결합할 수 있습니다.
# 패키지 로드
library(tidyverse)
library(sf)
library(ggplot2)
library(cowplot)
이전에 작성한 행정구 병합하기 글에서 만든 지도 데이터를 그대로 불러옵니다.
# 데이터 불러오기
map <- st_read("아웃풋/수도권 행정구 병합 지도.shp")
## Reading layer `수도권 행정구 병합 지도' from data source
## `C:\...\아웃풋\수도권 행정구 병합 지도.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 66 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -10044.95 ymin: 477264 xmax: 274945.2 ymax: 631207.8
## Projected CRS: Korea_2000_Korea_Central_Belt_2010
# 데이터 확인하기
head(map)
## Simple feature collection with 6 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 170923.2 ymin: 518463.7 xmax: 254296.8 ymax: 605780.4
## Projected CRS: Korea_2000_Korea_Central_Belt_2010
## SGG_NM COL_ADM_SE geometry
## 1 경기도 가평군 41820 MULTIPOLYGON (((239726.3 60...
## 2 경기도 고양시 41280 MULTIPOLYGON (((193799.4 57...
## 3 경기도 과천시 41290 MULTIPOLYGON (((200375.6 54...
## 4 경기도 광명시 41210 MULTIPOLYGON (((188355.1 54...
## 5 경기도 광주시 41610 MULTIPOLYGON (((230605 5485...
## 6 경기도 구리시 41310 MULTIPOLYGON (((213032.4 56...
옹진군 지도 그리기
옹진군은 수도권 서부 해안에서 멀리 떨어져 있어 별도의 박스 지도에 표시할 필요가 있습니다. 먼저, 옹진군만 필터링한 데이터를 사용하여 서브 지도를 그립니다. geom_sf를 사용해 지도를 그리고, theme_void와 theme 옵션을 사용해 지도의 배경을 설정합니다. 배경색은 옹진군이 바다에 위치한 특성을 반영해 파란색(“#A5D1F2”)으로 지정했습니다.
sub_map <- map %>%
filter(SGG_NM == "인천광역시 옹진군") %>%
ggplot() +
geom_sf(color = "gray40",
fill = "#F7F7F7",
linewidth = 0.4) +
theme_void() +
theme(
panel.border = element_rect(color = "gray20",
fill = NA,
linewidth = 0.3),
panel.background = element_rect(fill = "#A5D1F2")
)
sub_map

옹진군을 제외한 수도권 지도 그리기
이제 옹진군을 제외한 수도권 육지를 메인 지도로 표시합니다. filter 함수로 옹진군 데이터를 제외한 후, 나머지 데이터를 이용해 지도를 생성합니다. 바다가 아닌 지역도 있지만 메인 지도 또한 시각적 통일성을 위해 배경색을 파란색으로 표현해 주었습니다.
base_map <- map %>%
filter(SGG_NM != "인천광역시 옹진군") %>%
ggplot() +
geom_sf(color = "gray40",
fill = "#F7F7F7",
linewidth = 0.4) +
theme_void() +
theme(
panel.background = element_rect(fill = "#A5D1F2")
)
base_map

하나의 지도로 만들기
이제 cowplot 패키지를 사용해 두 지도를 결합합니다. ggdraw는 빈 캔버스를 생성하고, draw_plot은 플롯을 캔버스 위에 추가하는 역할을 합니다. 서브 지도를 메인 지도의 좌측 상단에 배치하기 위해 x = 0.18, y = 0.37로 지정했습니다. width로 서브 지도의 상대 크기를 설정해 메인 지도와의 비율을 조정합니다.
ggdraw(base_map) +
draw_plot(sub_map,
x = 0.18, y = 0.37,
width = 0.2)

이 방법을 활용하면 지도의 일부 지역을 누락하지 않으면서도, 메인이 되는 지역을 중심에 위치시켜 더 잘 보이도록 구성할 수 있습니다. 데이터의 전체 맥락을 유지하면서도 주요 정보를 강조하고 싶을 때 이 방법을 적극 활용해 보세요!