도로교통공단의 21년 교통사고 사망자 통계를 가지고 막대그래프로 만들어봤다. 흔히 성별로 그룹핑된 데이터는 좌우로 수평막대그래프 펼쳐 그려서 데이터를 표현한다. 잘 그리지 않는 유형이어서, 조금은 오래걸린거 같다. 색상이 너무 대비되는 걸 선택하면 약간 막대그래프끼리 어긋나보이는 착시(?) 현상이 있어서 비슷한 색감으로 채도만 조금 조정해봤다.
그래프 데이터 만들기
여기를 클릭해서 들어간 사이트에서 엑셀파일을 받을 수 있다. 도로교통공단에서 제공된 자료이며, 아래에 보듯이 엑셀파일 내에는 연령층별 남녀별 사망자/중상자/경상자 등의 데이터를 볼 수 있다.
다운받았다면, 엑셀파일을 read_excel
함수로 읽어준다.
tb1 = readxl::read_excel( "도로교통공단_사상자 연령층별 성별 교통사고 통계_20211231.xlsx")
tb1 %>% head()
# A tibble: 6 × 6
사상자연령층 사상자성별 사망자수 중상자수 경상자수 부상신고자수
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 12세이하 남 15 719 4856 639
2 12세이하 여 8 420 3920 424
3 13-20세 남 73 1787 7078 1164
4 13-20세 여 20 751 3992 331
5 21-30세 남 222 5122 28503 2490
6 21-30세 여 47 2033 15768 914
사망자수에 대한 그래프를 만들 예정이라, 쓸데없는 필드는 제외하는 로직을 추가한다.
tb2 = tb1 %>%
select(age = 사상자연령층, gender = 사상자성별, n = 사망자수) %>%
filter(age != '불명', gender != "기타/불명")
tb2 %>% head()
# A tibble: 6 × 3
age gender n
<chr> <chr> <dbl>
1 12세이하 남 15
2 12세이하 여 8
3 13-20세 남 73
4 13-20세 여 20
5 21-30세 남 222
6 21-30세 여 47
그래프 만들기
x축에는 연령층(age)
을 셋팅하고, y축에는 사망자수(n)
을 셋팅한다. 별다른 셋팅없이 geom_col
을 이용해서 막대그래프를 그리면, 누적으로 쌓이는 막대그래프가 그려진다.
ggplot(tb2, aes(age, n, fill = gender)) +
geom_col()
원하는 그래프는 좌우로 펼쳐지는 막대그래프이기 때문에, 데이터에 정보를 몇가지 더 추가해야 한다.
tb3 = tb2 %>%
mutate(n2 = ifelse(gender == "남", n * -1, n),
ord = as.numeric(str_sub(age, 1, 2)))
tb3 %>% head
# A tibble: 6 × 6
age gender n n2 h ord
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 12세이하 남 15 -15 1.3 12
2 12세이하 여 8 8 -0.6 12
3 13-20세 남 73 -73 1.3 13
4 13-20세 여 20 20 -0.6 13
5 21-30세 남 222 -222 1.3 21
6 21-30세 여 47 47 -0.6 21
우선 위아래로 x축을 기준으로 막대그래프를 그려야 하기 때문에, 남자는 마이너스값으로 여자는 플러스값으로 셋팅된 n2
값을 사용한다.
ggplot(tb3, aes(age, n2, fill = gender)) +
geom_col()
coord_flip
함수를 이용해서 x/y 축을 바꿔준다.
ggplot(tb3, aes(age, n2, fill = gender)) +
geom_col() +
coord_flip()
만약 연령층의 순서를 바꾸고 싶으면, reorder
를 이용해서 조정이 가능하다. 자세한 방법은 여기를 클릭.
ggplot(tb3, aes(reorder(age, -ord), n2, fill = gender)) +
geom_col() +
coord_flip()
마지막으로 쓸데없는 정보들 삭제하고, 폰트, 색상 등을 설정하면 끝.