텍스트 윤곽선 추가하기
개요
지난번 지역명 겹치지 않게 배치하기 글에서는 수도권 지도를 그리고 지역명을 겹치지 않게 배치하는 방법을 알아봤습니다. 텍스트를 분산 배치하거나, 면적이 작은 일부 지역의 명칭을 생략하는 방법으로 문제를 해결했죠. 이번에는 지도의 가독성을 한 단계 더 높이기 위해 텍스트에 윤곽선을 추가하는 방법을 살펴보겠습니다. 텍스트에 윤곽선을 더하면 글씨가 지도 배경과 겹치지 않으면서 더 선명하게 보이게 됩니다.
데이터 준비하기
먼저, 지도를 그릴 데이터를 준비합니다. 기본적인 데이터 처리 및 지도 생성 방법은 지역명 겹치지 않게 배치하기 글을 참고하세요. 아래 코드는 지도를 그리기 위한 데이터 준비 단계입니다.
# 패키지 로드
library(tidyverse)
library(sf)
library(ggplot2)
library(showtext)
library(ggrepel)
# 글꼴 설정
font_add("kopub", "C:/Users/.../AppData/Local/Microsoft/Windows/Fonts/KoPub Dotum Medium.ttf")
showtext_auto()
showtext_opts(dpi=300)
theme.size = 10
text.size = theme.size / .pt
# 데이터 불러오기
sdg <- st_read("아웃풋/수도권 행정구 병합 지도.shp") %>%
separate(col = SGG_NM,
into = c("SD_NM", "SGG_NM"),
sep = " ",
fill = "right")
## Reading layer `수도권 행정구 병합 지도' from data source
## `...\아웃풋\수도권 행정구 병합 지도.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
# 폴리곤 면적 계산
sdg <- sdg %>%
mutate(면적 = as.numeric(st_area(sdg)))
geom_text_repel로 텍스트 윤곽선 추가하기
geom_text_repel 함수는 텍스트가 서로 겹치지 않도록 자동으로 배치하는데 유용합니다. 여기에 bg.color와 bg.r 인자를 사용하면 텍스트에 윤곽선을 추가할 수 있습니다. bg.color로 윤곽선의 색상, bg.r로 윤곽선의 두께를 설정할 수 있습니다. 아래는 geom_text_repel을 활용해 텍스트 간 간격을 자동으로 조정하면서, 텍스트에 윤곽선을 추가하는 코드입니다.
# 지도 작성하기
ggplot(data = sdg) +
geom_sf(colour = "gray40", fill = "#eaeaea", linewidth = 0.5) +
geom_text_repel(aes(label = SGG_NM, geometry = geometry),
stat = "sf_coordinates",
family = "kopub",
size = text.size,
force = 0.0001,
force_pull = 1000,
color = "white",
bg.color = "black",
bg.r = 0.1) +
theme_void()

geom_shadowtext로 텍스트 윤곽선 추가하기
shadowtext 패키지의 geom_shadowtext를 사용하면 텍스트에 윤곽선을 간단히 추가할 수 있습니다. geom_sf_text와는 달리, geom_shadowtext를 사용할 때는 geometry와 stat을 지정해야 합니다. 이는 shadowtext가 sf 객체의 좌표를 활용할 수 있도록 하기 위함입니다. 글자의 색상은 color로 조정하고, 윤곽선의 색상과 두께는 bg.color와 bg.r로 조정할 수 있습니다. 아래는 면적 기준으로 작은 지역명을 생략하고, 텍스트에 검정색 윤곽선을 추가하는 코드입니다.
# 패키지 로드
library(shadowtext)
# 지도 작성하기
ggplot(data = sdg) +
geom_sf(colour = "gray40", fill = "#eaeaea", linewidth = 0.5) +
geom_shadowtext(aes(label = ifelse(sdg$면적 < median(sdg$면적), "", SGG_NM),
geometry = geometry),
stat = "sf_coordinates",
family = "kopub",
size = text.size,
color = "white",
bg.color = "black",
bg.r = 0.1) +
theme_void()

이번 글에서는 지도 텍스트의 가독성을 높이기 위해 윤곽선을 추가하는 두 가지 방법을 소개했습니다. 텍스트 중첩 문제를 해결하면서 윤곽선을 추가하려면 geom_text_repel을 사용하는 것이 좋고, 중첩 문제가 없거나 다른 방식으로 해결한 경우에는 geom_shadowtext를 추천합니다. 두 방법 모두 텍스트를 더 선명하고 깔끔하게 보여줄 수 있으니, 시각화 목적에 맞게 활용해 보세요!