색상으로 특정 값 강조하기
개요
막대그래프를 통해 데이터를 시각화할 때, 특정 값을 강조하여 메시지를 효과적으로 전달하고자 할 때가 있습니다. 예를 들어, 상위 3개 값을 녹색으로 표시하거나, 하위 3개 값을 따로 강조하고 싶을 수 있습니다. 이번 글에서는 특정 조건에 해당하는 값을 색상으로 구분하여 강조하는 방법을 소개합니다. 이 방법은 단순히 상하위 n개의 값을 구분하는 데 그치지 않고, 다양한 조건에 따라 특정 값을 강조하는 데 활용될 수 있습니다.
데이터 준비하기
2023년 기준 서울특별시 25개 구의 주민등록인구 데이터를 활용하여 막대그래프를 그리겠습니다. 우선, 필요한 패키지를 로드하고 차트에서 사용할 글꼴을 설정합니다.
# 패키지 로드
library(readxl)
library(tidyverse)
library(ggplot2)
library(showtext)
library(scales)
# 차트 글꼴 설정
font_add("kopub", "C:/Users/.../AppData/Local/Microsoft/Windows/Fonts/KoPub Dotum Medium.ttf")
showtext_auto()
showtext_opts(dpi=300)
theme.size = 12
text.size = theme.size / .pt
데이터는 통계청의 시군구별 주민등록인구 데이터를 활용합니다. 데이터를 로드한 후, 서울특별시 데이터만 추출합니다.
# 데이터 로드
data <- read_xlsx("데이터/주민등록인구_시도_시군구_2023.xlsx", skip=1)
# 서울 데이터만 추출
seoul <- data %>%
rename(시도 = `행정구역별(1)`,
구 = `행정구역별(2)`,
인구수 = `계 (명)`) %>%
filter(시도 == "서울특별시",
구 != "소계")
# 데이터 확인
head(seoul)
## # A tibble: 6 × 3
## 시도 구 인구수
## <chr> <chr> <dbl>
## 1 서울특별시 종로구 139417
## 2 서울특별시 중구 121312
## 3 서울특별시 용산구 213151
## 4 서울특별시 성동구 277361
## 5 서울특별시 광진구 335554
## 6 서울특별시 동대문구 341149
내림차순 정렬 막대그래프 그리기
서울특별시 구별 주민등록인구 수를 내림차순으로 정렬하여 막대그래프를 그립니다. 인구수 단위를 ‘만 명’으로 바꾸고, 그래프에 적절한 축 레이블을 추가합니다.
seoul %>%
ggplot(aes(x = reorder(구, -인구수), y = 인구수 / 10000)) +
geom_col(width = 0.6) +
scale_x_discrete(name = "") +
scale_y_continuous(name = "주민등록인구 수(만 명)",
expand = expansion(mult = c(0, 0.1))) +
theme_minimal(base_size = theme.size, base_family = "kopub")

특정 값을 색상으로 강조하기
인구수 기준으로 상위 3개 구를 강조하고 나머지 구는 기본 색상으로 표시합니다. 이를 위해 데이터프레임에 순위와 색상 컬럼을 추가하고, ggplot에서 fill로 색상을 지정합니다. scale_fill_identity를 사용하면 데이터프레임에 정의된 색상을 그래프에 그대로 적용할 수 있습니다.
seoul_clr <- seoul %>%
mutate(순위 = rank(-인구수),
색상 = case_when(순위 < 4 ~ "#027453",
T ~ "#D9D8D6"))
seoul_clr %>%
ggplot(aes(x = reorder(구, -인구수), y = 인구수 / 10000,
fill = 색상)) +
geom_col(width = 0.6) +
scale_x_discrete(name = "") +
scale_y_continuous(name = "주민등록인구 수(만 명)",
expand = expansion(mult = c(0, 0.1))) +
scale_fill_identity() +
theme_minimal(base_size = theme.size, base_family = "kopub")

차트를 세련되게 다듬기
차트를 세련되게 만들기 위해 막대의 경계선을 뚜렷하게 만들고, 글꼴 색상을 수정하고, 중요한 그리드만 남기고, 축의 굵기를 조절해 줍니다. 또한, 데이터를 더욱 직관적으로 전달하기 위해 인구수를 표시하는 텍스트를 추가합니다.
seoul_clr %>%
ggplot(aes(x = reorder(구, -인구수), y = 인구수 / 10000,
fill = 색상)) +
geom_col(width = 0.6,
color = "gray10",
linewidth = 0.2) +
geom_text(aes(label = comma(인구수 / 10000, accuracy = 1)),
family = "kopub",
size = text.size,
color = "gray10",
vjust = -1) +
scale_x_discrete(name = "") +
scale_y_continuous(name = "주민등록인구 수(만 명)",
expand = expansion(mult = c(0, 0.1))) +
scale_fill_identity() +
theme_minimal(base_size = theme.size, base_family = "kopub") +
theme(
axis.line.x = element_line(linewidth = 0.8, color = "gray10"),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_line(linewidth = 0.2, color = "gray40"),
axis.text = element_text(color = "gray10"),
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
)

이 방법을 활용하면 상하위 n개의 값을 강조하는 데 그치지 않고, 다양한 조건에 따라 원하는 데이터를 유연하게 강조할 수 있습니다. 예를 들어, 특정 기준을 초과하거나 미달하는 값을 강조하거나, 특정 지역이나 범주에 속한 데이터를 구분할 수도 있습니다. 전달하고자 하는 메시지에 맞춰 조건을 설정해 데이터를 효과적으로 시각화해 보세요!