원형차트와 도넛차트 그리기
개요
이번 글에서는 원형차트(Pie chart)와 도넛차트(Donut chart)를 그리는 방법을 소개합니다. 2023년 시도별 시, 군, 구의 주민등록인구 비중 데이터를 활용하여 차트를 시각화하고, 두 차트의 차이점과 적합한 활용 방법도 함께 설명합니다.
데이터 준비하기
우선, 비율 계산 글에서 계산한 데이터를 사용합니다. 데이터를 정리하고, 시도별 시, 군, 구의 주민등록인구 비율을 계산합니다.
# 패키지 로드
library(tidyverse)
library(readxl)
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)
# 데이터 정리하기
data2 <- data %>%
rename(시도 = `행정구역별(1)`,
시군구 = `행정구역별(2)`,
주민등록인구수 = `계 (명)`) %>%
filter(시도 != "전국",
(시도 == "세종특별자치시")|(시군구 != "소계")) %>%
mutate(시군구 = case_when(시도 == "세종특별자치시" ~ "세종특별자치시",
T ~ 시군구),
시도 = factor(시도, levels = unique(data$`행정구역별(1)`)[-1]),
구분 = case_when(grepl("시$", 시군구) ~ "시",
grepl("군$", 시군구) ~ "군",
grepl("구$", 시군구) ~ "구"),
구분 = factor(구분, levels = c("시", "군", "구")))
# 비율 계산하기
sum <- data2 %>%
group_by(시도, 구분) %>%
summarise(주민등록인구수 = sum(주민등록인구수, na.rm = TRUE)) %>%
group_by(시도) %>%
mutate(비율 = 주민등록인구수 / sum(주민등록인구수, na.rm = TRUE))
head(sum)
## # A tibble: 6 × 4
## # Groups: 시도 [4]
## 시도 구분 주민등록인구수 비율
## <fct> <fct> <dbl> <dbl>
## 1 서울특별시 구 9386034 1
## 2 부산광역시 군 178729 0.0543
## 3 부산광역시 구 3114633 0.946
## 4 대구광역시 군 285072 0.120
## 5 대구광역시 구 2089888 0.880
## 6 인천광역시 군 89382 0.0298
원형차트 그리기
원형차트(Pie chart)는 비율로된 데이터를 시각화하는 데 유용합니다. geom_col과 coord_polar("y") 함수를 조합해 원형차트를 그릴 수 있습니다. geom_col로 데이터를 막대 형태로 시각화한 뒤, coord_polar를 사용하면 직사각형 좌표계를 원형으로 변환할 수 있습니다. 특히, coord_polar("y")로 지정하면 막대의 높이(y)가 각도로 변환되어, 데이터 비율이 원형으로 나타납니다. 원형차트에 텍스트를 표기할 때도 누적막대그래프와 마찬가지로 geom_text에 position = position_stack(vjust = 0.5)로 지정하면 됩니다.
모든 시도에 대해 원형차트를 표현하면 정보가 잘 전달되지 않으므로, 부산광역시, 울산광역시, 경상남도에 대해서만 차트를 그리겠습니다.
sum %>%
filter(시도 %in% c("부산광역시", "울산광역시", "경상남도")) %>%
ggplot(aes(x = 1, y = 비율, group = 시도, fill = 구분,
label = percent(비율, accuracy = .1))) +
geom_col(width = 1, linewidth = 0.4, color = "white") +
geom_text(family = "kopub",
position = position_stack(vjust = 0.5),
size = text.size) +
scale_fill_brewer(palette = "Pastel2") +
coord_polar("y") +
facet_wrap(~시도, nrow = 1) +
theme_minimal(base_size = theme.size, base_family = "kopub") +
theme(
panel.grid = element_blank(),
axis.line = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
legend.title = element_blank(),
legend.position = "bottom",
legend.box.background = element_rect(color = "#959595", linewidth = 1),
legend.key.size = unit(theme.size, "pt"),
strip.text = element_text(color = "black", size = theme.size)
)

도넛차트 그리기
도넛차트(Donut chart)는 원형차트와 비슷하지만 가운데를 비워둬서 면적에 길이 속성이 추가된 차트입니다. 가운데 빈 공간에 차트 제목을 추가할 수도 있습니다. geom_col의 x = 2.5로 설정하고 width = 1로 하여 원형 중앙을 비웁니다. geom_text에서 x = 0으로 설정해 시도명을 중앙 빈 공간에 표시합니다. facet_wrap으로 자동 생성되는 시도명 텍스트를 숨기기 위해 theme 함수에 strip.text = element_blank()와 strip.background = element_blank()를 추가합니다.
sum %>%
filter(시도 %in% c("부산광역시", "울산광역시", "경상남도")) %>%
ggplot(aes(x = 2.5, y = 비율, fill = 구분)) +
geom_col(width = 1, linewidth = 0.4, color = "white") +
geom_text(aes(label = percent(비율, accuracy = .1)),
family = "kopub",
position = position_stack(vjust = 0.5),
size = text.size) +
geom_text(aes(x = 0, label = 시도),
size = text.size,
fontface = "bold") +
scale_fill_brewer(palette = "Pastel2") +
coord_polar("y") +
facet_wrap(~시도, nrow = 1) +
theme_minimal(base_size = theme.size, base_family = "kopub") +
theme(
panel.grid = element_blank(),
axis.line = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
legend.title = element_blank(),
legend.position = "bottom",
legend.box.background = element_rect(color = "#959595", linewidth = 1),
legend.key.size = unit(theme.size, "pt"),
strip.text = element_blank(),
strip.background = element_blank()
)

누적막대그래프, 원형차트, 도넛차트의 차이점
비율의 합이 100%일 때 데이터를 시각화하는 방법으로 누적막대그래프, 원형차트, 도넛차트 등이 주로 사용됩니다. 모두 비율 데이터를 표현하는 데 유용하지만, 데이터의 특성과 전달하려는 메시지에 따라 적절히 선택해야 합니다.
누적막대그래프는 데이터를 길이로 표현하여 각 항목의 비율을 직사각형 형태로 누적해서 보여줍니다. 사람들은 각도나 면적보다 길이의 차이를 더 정확히 파악하기 때문에, 비율 데이터를 전달하는 데 가장 효율적인 차트입니다. 누적막대그래프 그리는 법은 누적막대그래프 그리기 글을 참고해 주세요.
원형차트는 데이터를 각도로 변환해 전체가 100%로 구성된 원 형태로 보여줍니다. 전체와 각 항목의 비율을 직관적으로 표현하기 좋아, 데이터를 단순하게 전달하는 데 유용합니다. 다만, 각도를 비교하는 데 어려움이 있어 항목 간 비율 차이를 정확히 전달하기는 어렵습니다.
도넛차트는 원형차트를 변형하여 가운데를 비운 형태입니다. 원형차트의 장점을 유지하면서, 길이 속성을 추가해 항목 간 비율 차이를 더 명확히 표현할 수 있습니다. 또한, 중앙 공간을 활용해 추가 정보를 표시할 수 있어 유용합니다.
항목 수가 많아질수록 모든 차트는 복잡해지기 쉽습니다. 데이터를 단순화하고, 항목 수를 적절히 제한하는 것이 중요합니다. 예를 들어, 이번 글에서는 시, 군, 구라는 세 가지 항목으로만 구성해 시각화했기 때문에, 정보 전달이 효과적이었습니다.
각 차트의 특징을 잘 활용해, 데이터를 가장 효과적으로 전달할 수 있는 방법을 찾아보세요!