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