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()
마지막으로 폰트, 색상, 레이아웃 등을 손보면 아래와 같이 만들 수 있다.