숫자 포맷팅

데이터 준비

숫자 데이터를 효과적으로 시각화하기 위해 콤마 표기, 백분율 변환, 소수점 조정 등 다양한 포맷팅 기법을 활용할 수 있습니다. 이번 포스팅에서는 항공 승객 데이터를 사용해 포맷팅 주요 팁을 정리하였습니다.

AirPassengers 데이터를 데이터프레임으로 변환하여 연도별 승객 수를 계산합니다. 이후, 전년 대비 승객 수 증감률을 추가합니다.

# 패키지 로드
library(tidyverse)

# 데이터 준비
data <- data.frame(matrix(AirPassengers, ncol = 12, byrow = TRUE))

colnames(data) <- seq(1, 12)

data <- data %>% mutate(년도 = seq(1949, 1960))

data2 <- data %>% 
  mutate(
    `승객 수` = rowSums(across(1:12)),
    `전년 대비 승객 수 증감률` = (`승객 수` - lag(`승객 수`)) / lag(`승객 수`)
  ) %>% 
  select(년도, `승객 수`, `전년 대비 승객 수 증감률`)

콤마 표기하기

세 자리마다 콤마를 추가하려면 scales 패키지의 comma 함수를 활용하면 됩니다.

# 패키지 로드
library(scales)

# 그래프 작성
ggplot(data = data2,
       aes(x = 년도, y = `승객 수`, 
           label = comma(`승객 수`))
       ) +
  geom_col(width = 0.6) +
  geom_text(vjust = -1) +
  theme_bw()

숫자 세 자리마다 콤마를 추가한 그래프

백분율 표기 및 소수점 조정하기

전년 대비 승객 수 증감률을 백분율로 변환하고, 소수점 한 자리까지만 표시합니다.

ggplot(data = data2,
       aes(x = 년도, y = `전년 대비 승객 수 증감률`,
           label = percent(`전년 대비 승객 수 증감률`, accuracy = 0.1))
       ) +
  geom_line(size = 1) +
  geom_text(vjust = -1) +
  theme_bw()

숫자를 백분율로 변환하고 소수점 한 자리까지 표기한 그래프

그래프 완성하기

위에서 소개한 내용을 모두 적용한 그래프를 작성합니다. 추가적으로 선 그래프 위에 점을 추가하고, 그래프의 미적 요소를 개선합니다.

# 패키지 로드
library(showtext)

# 글꼴 설정
font_add_google("Noto Sans KR", "noto")
showtext_auto()
showtext_opts(dpi = 300)

theme.size = 10
geom.text.size = theme.size/.pt 

# 혼합형 그래프 작성을 위한 상수 계산
coeff <- data2[2, "승객 수"] / data2[2, "전년 대비 승객 수 증감률"] * 0.8

# 그래프 작성
ggplot(data = data2, aes(x = 년도)) +
  geom_col(aes(y = `승객 수`, fill = "승객 수"), width = 0.6) +
  geom_text(aes(y = `승객 수`, label = comma(`승객 수`)), 
            vjust = -1, family = "noto", size = 3) +
  geom_line(aes(y = `전년 대비 승객 수 증감률` * coeff, color = "전년 대비 승객 수 증감률"), size = 1) +
  geom_point(aes(y = `전년 대비 승객 수 증감률` * coeff, color = "전년 대비 승객 수 증감률"), size = 2) +
  geom_text(aes(y = `전년 대비 승객 수 증감률` * coeff, 
                label = percent(`전년 대비 승객 수 증감률`, accuracy = 0.1, suffix = "")), 
            vjust = -1, family = "noto", size = 3) +
  scale_fill_manual(values = "#9AD1F5") +
  scale_color_manual(values = "#e25a6c") +
  scale_x_continuous(n.breaks = 12) +
  scale_y_continuous(
    name = "승객 수(천 명)",
    labels = comma_format(),
    expand = expansion(mult = c(0, 0.1)),
    sec.axis = sec_axis(~./coeff, name = "전년 대비 승객 수 증감률(%)", labels = percent_format(suffix = ""))
  ) +
  theme_bw(base_family = "noto") +
  theme(
    panel.grid = element_blank(),
    legend.title = element_blank(),
    legend.background=element_blank(),
    legend.key.size=unit(geom.text.size, "mm"),
    legend.text=element_text(size=rel(1)),
    legend.position=c(0.20, 0.90),
    legend.margin=margin(0, 0, 0, 0)
  )

막대그래프와 선그래프를 합친 그래프