reorder 로 ggplot2 막대그래프 정렬하기

ggplot 으로 막대그래프를 그리는 건 2줄 코딩이면 만들 수 있다. 다만, 그전에 데이터를 이해하고 그래프를 그리기 적합한 구조로 만들어놓는 것이 오래걸린다. 오늘은 건강보험심사평가원 - 전국 병의원 및 약국 현황 정보를 이용해서 아래와 같은 간단한 막대그래프를 그려보고 높은순으로 내림차순까지 해볼까 한다.

그래프 데이터 만들기

[건강보험심사평가원 - 전국 병의원 및 약국 현황] 링크에 가면 엑셀데이터를 받을 수 있다. 6개의 엑셀파일이 있을건데, 2번째 엑셀파일이 지역별 약국정보이다. 엑셀파일을 열어보면 약국이름, 시도코드, 우편번호, 주소, 전화번호, 개설일자 등 자료가 정리되어 있다.

이 모든 필드를 쓸건 아니고, 그냥 시도별로 약국 개수가 얼마인지만 집계하려 한다. 최상위 7개 시도만 잘라서 최종 데이터를 만들었다.

tb1 = read_excel('./2022/20221024/pharmacy_202206.xlsx')

tb2 = tb1 %>% 
  select(sido = 시도코드명, 
         name = 요양기관명) %>% 
  group_by(sido) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>% 
  head(7)

# A tibble: 7 × 2
  sido      n
  <chr> <int>
1 경기   5505
2 서울   5438
3 부산   1652
4 경남   1365
5 대구   1335
6 인천   1184
7 경북   1107

막대그래프 그리기

두 줄이면 막대그래프는 간단히 그려진다. 근데 별다른 설정없이 막대그래프를 그려보니, x축이 가나다순으로 되어 있어 막대그래프가 뒤죽박죽으로 보인다.

ggplot(tb2, aes(sido, n)) +
  geom_col()

막대그래프를 정렬하려면 x축값인 경기,서울,부산,경남... 이 데이터를 일반 텍스트가 아닌, factor 로 형변환을 해야한다. 그 변환시에 factor 의 level 값을 조정하는 reorder 를 이용하면 쉽게 level 을 지정할 수 있다.

우선 아래의 예를 보면, 의미없는 A,B,C 값에 가중치를 부여해서 값들간에 레벨이 지정된걸 볼 수 있다.

> reorder(c("A","B","C"), c(1,2,3))
[1] A B C
attr(,"scores")
A B C 
1 2 3 
Levels: A B C

그러면 역순으로 하면 어떻게 될까. 레벨이 역으로 지정된 것을 볼 수 있다. 이걸 이용해서 x축의 막대그래프 순서를 바꿔볼까한다.

> reorder(c("A","B","C"), c(3,2,1))
[1] A B C
attr(,"scores")
A B C 
3 2 1 
Levels: C B A

막대그래프 정렬하기

앞서 배운 reorder 를 사용해서 막대그래프를 정렬해본다. reorder(sido, n) 로 바꿔넣으면 sido가 factor 형으로 변경되면서 정렬이 된다. 근데 원하는 그림은 가장높은 막대그래프가 제일 먼저나오는 것이었는데, 맨 뒤에 있다. 이유는 경북이 레벨이 가장 작고(낮고), 경기가 레벨이 가장크기(높기) 때문이다.

ggplot(tb2, aes(reorder(sido, n), n)) +
  geom_col() 

이걸 내림차순으로 바꾸고자 한다면 간단하다. -n 으로 변경해주면 된다.

ggplot(tb2, aes(reorder(sido, -n), n)) +
  geom_col() 

마지막으로 폰트, 색상, 레이아웃 등을 손보면 아래와 같이 만들 수 있다.


더 보면 좋을 글들