brunch

You can make anything
by writing

C.S.Lewis

by 쩐시 Aug 26. 2021

R의 ggplot2 ,파이차트&막대그래프 마스터하기

완벽한 논문을 위한 R 프로그래밍 분석

https://brunch.co.kr/@sjh001/47


앞선 글에서 나는 서울시 음식점 창업 관련 분석을 R ggplot2 패키지의 다양한 시각화 함수를 이용해 표현하고자 했다.


이번 글에서는 그 중 '파이 차트' 제작과정만 따로 서술하고자 했다. 왜냐하면 가장 시간이 오래걸리고 나같은 초보자에게 어려웠기 때문이다... :(


기존 활용했던 교재에서도 다루지 않아, 구글에 검색하여 최대한 내 목적에 맞는 간단한 참고 사이트들을 찾고자 했다.



<참고한 사이트>

https://bioinformaticsandme.tistory.com/235

https://www.r-bloggers.com/2018/10/how-to-make-a-pie-chart-in-r/





파이차트를 만들어봐야겠다는 생각은 코로나 전후 창업 음식점 업종별 개업 비율을 비교하다가, 파이차트로 표현해보면 어떨까 하는 호기심이 생겨서이다.


처음에는 막대그래프로 비교하는 전체 업종별 개업 비율을 하나의 그래프로 나타내고자 했다. 그 코드는 아래와 같다. 코로나 전후를 fill로 표시해야하기 때문에, 각각 두개의 데이터 프레임을 하나로 만들어야 했으며 이때 사용된 pivot_longer의 구성이 왜 사용됬는지 인식하는게 코드 디자인 시 중요하기 때문에 각각의 결과치들도 함께 첨부하겠다.


# 코로나 이전, 업종별 개업 비율

bc_open_pct <- foodshop %>% 

  filter(!is.na(open_date_bc), !is.na(type), !is.na(district)) %>% 

  group_by(type) %>% 

  summarise(n = n()) %>% 

  mutate(total = sum(n),

         pct = round(n/total*100,1)) %>% 

  arrange(desc(n))

결측치 처리한 후, 업종별로 구분하여 전체 개업수에 따른 각각의 비율을 표시한다. bc와 ac의 차이는 날짜 결측치를 처리하면서 따로 만든 파생변수를 활용하였다.


# 코로나 이후, 업종별 개업 비율

ac_open_pct <- foodshop %>% 

  filter(!is.na(open_date_ac), !is.na(type), !is.na(district)) %>% 

  group_by(type) %>% 

  summarise(n = n()) %>% 

  mutate(total = sum(n),

         pct = round(n/total*100,1)) %>% 

  arrange(desc(n))


# 그래프 속 여러 변수를 표현하기 위해, 위의 두 프레임을 총합&pivot_longer 사용

open_pct <- left_join(bc_open_pct, ac_open_pct, by ='type') %>% 

  rename(bc = 'pct.x',

         ac = 'pct.y') %>% 

  select(type, bc, ac) %>% 

  pivot_longer(-type, names_to='bc_ac', values_to='pct')  

pivot_longer함수를 사용하기 전까지는 위와 같은 결과 값이 나온다. bc와 ac의 값을 같은 업종별로 통합시켜서 이런 구조가 된다. 원래는 3+3개의 컬럼이 나오지만, 우리가 사용할것은 비율부분이기에 하나씩 뽑았다. 

그리고 피벗을 사용하면 아래와 같은 구조로 변환된다.

pivot_longer(-type, names_to='bc_ac', values_to='pct')  마지막에 구동한 이 코드를 보면, 전체 type을 기준으로 정렬하여, bc_ac를 나란히 하나의 컬럼에 집어넣었다. 함수 값에 넣은 것들은 타이틀이니 원하는 것으로 넣으면 된다. 

이렇게 위아래로 길게 두개의 데이터 프레임이 만들어지면, 막대 그래프를 그릴때 fill을 사용하여 더 이쁘게 나타낼 수 있다.


# 분할 가로 막대그래프 제작

ggplot(data = open_pct, aes(x = type, y = pct, fill = bc_ac))+

  geom_col(stat='identity', position = 'dodge')+

  coord_flip()

업종의 가지수가 많으니 옆으로 좀 눕혔다. 어떤가? 두 개 이상의 구분이 들어가도록 색이 bc_ac로 구분되니 더 보기가 좋다. 개인적으로 dodge 형식을 더 선호한다.


사실 이렇게 까지 봐도 문제는 없다. 다만 평소에 파이차트를 안만들어봐서, bc&ac 각각 만들어봐도 이쁠것 같다는 나의 호기심이... 도전하게 했다.


graphics라는 패키지도 있지만, 나에게는 너무 복잡해서 ggplot2의 내장기능으로 만족하고자 한다. 충분하다!

패키지 구동은 아래와 같다.

library(ggplot2)

library(ggrepel)

library(tidyverse)

library(RColorBrewer)


각각의 차트를 만들기 전, 역시 새로운 객체를 만들어준다. 위의 데이터 프레임에서 상위 6개씩 뽑아내어 부여한 것 뿐이다. 그대로 했다가 파이 분할이 엄청 자잘해져서 값 표시도 안될정도였어서 규모를 줄였다.


#코로나 이전 업종별 개업비율 6순위

pie_bc <- bc_open_pct %>% 

  arrange(desc(pct)) %>% 

  head(6)


#코로나 이전 업종별 개업비율 6순위

pie_ac <- ac_open_pct %>% 

  arrange(desc(pct)) %>% 

  head(6)


#파이파트로 표현한 업종별 비율 

ggplot(data = pie_ac, aes(x = '', y = pct, fill=type))+

  geom_bar(stat = 'identity', width = 0.5)+

  coord_polar('y', start = 0)+

  geom_text(aes(label = paste0(round(pct), "%")), position = position_stack(vjust = 0.5))+

  scale_fill_manual(values=c("#55DDE0", "#33658A", "#2F4858", "#999999", "#F6AE2D", "#F26419"))+

  labs(x = NULL, y = NULL, fill = NULL, title = "AC_open_pct")+

  theme_minimal()+

  theme_classic() + theme(axis.line = element_blank(),

                          axis.text = element_blank(),

                          axis.ticks = element_blank(),

                          plot.title = element_text(hjust = 0.5, color = "#666666"))


위의 코드를 잘 기억해뒀다가 나중에 파이차트를 만들때 그대로 써보길 바란다. 


제일 먼저, ggplot() 부분의 x함수 값은 따로 지정하지 않는다. 파이차트는 x축이 의미가 없으니 말이다. y축에 표현하고자 하는 비율값을 넣고, 채우는 것은 업종별이기 때문에 type을 넣는다.


ggplot을 이용한 파이차트는 신기하게도 먼저 누적 비율 막대그래프를 그리고 거기에 하나하나 레이어드를 추가하는 식으로 코딩이 짜여진다.


geom_bar(stat = 'identity', width = 0.5)까지 구동하면 아래와 같은 그래프가 나온다. 역시 위로 긴 누적 그래프기 때문에 x축은 비워둔다. width를 1이상으로 기입하면 옆으로 통통한 막대 그래프가 된다.

cood_polar('y', start = 0)까지 구동한다. 그럼 아래와 같이 뭔가 애매한 파이차트가 나온다. 굉장히 촌스럽다. 참고로 'y'대신 'x'를 넣으면 반쪽 파이가 나오며, start=0 숫자를 바꿀 때마다 파이가 빙글빙글 도는 재밌는 일이 발생한다. 추후 다양한 디자인의 파이를 만들때 사용하는 듯 하다.

geom_text(aes(label = paste0(round(pct), "%")), position = position_stack(vjust = 0.5))+

  scale_fill_manual(values=c("#55DDE0", "#33658A", "#2F4858", "#999999", "#F6AE2D", "#F26419"))+

  labs(x = NULL, y = NULL, fill = NULL, title = "AC_open_pct")+

  theme_minimal()+

  theme_classic() + theme(axis.line = element_blank(),

                          axis.text = element_blank(),

                          axis.ticks = element_blank(),

                          plot.title = element_text(hjust = 0.5, color = "#666666"))


우리는 비율이 값이기 때문에, %를 붙여서 나타내고 그 위치도 잡아준다. 또 색깔도 원하는 색으로 수동 반영해주었다. 관련해서 참고로 링크 넣은 사이트들을 잘 보면 좋을 듯 하다. 나머지 labs, theme 부분은 모두 좀 더 깔끔하게 나타내기 위해 넣은 옵션들이다. 


모두 다 적용하면 아래와 같은 파이가 완성된다!


여러가지 이쁜 색들을 도전해보았으나, 구글에서 가장 합이 좋아보이는 이미지로 따라해보았다...

R 프로그램상에서 파이를 만들면 이렇게 겉지름이 울퉁불퉁한 이미지만 나오는데, 이를 pdf로 export하면 오른쪽과같이 굉장히 깔끔하게 다운받을 수 있다. 

주의할 점은 내 데이터들을 당초 다 한글로 type을 만들었었는데, 나중에 pdf상으로 한글 출력이 안돼어서 급하게 영문으로 다 바꾸니 표시가 됐다. 혹여나 나같은 사람이 있을까 싶어 주의를 요한다. 

아마 한글로도 출력할 수 있는 방법이 있을 듯 하지만 나는 그런 능력이 아직 안되므로 여기서 끝마치도록 한다!



작가의 이전글 코로나 후, 어떤 음식업종의 개업&폐업이 늘었나

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari