본문 바로가기

Data

[R] 데이터 시각화 with R ( 막대그래프/와플차트 )

T아카데미에서 들은 "데이터 시각화 with R" 이라는 강의를 복습한 자료이다!

자료가 너무 알차서 배워가는 게 정말 많은 시간이었다.

특히 강사님이 내가 제일 자주 참고하는 블로그 주인이셨다는게 너무 신기했다

강의는 아래 링크를 타고 들어가면 된다!

https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=172

 

데이터 시각화 with R | T아카데미 온라인강의

1. R 시각화 라이브러리인 ggplot2의 기본적인 사용방법에 대해 알아봅니다. 2. ggplot2를 활용하여 기본 그래프 및 차트, 비정형 그래프 그리기 등 표현방법에 대해 ..

tacademy.skplanet.com

 

막대그래프

2019 프로야구 데이터를 막대그래프로 나타내보자

library(tidyverse)
library(dplyr)
library(ggthemes)
library(ggplot2)

read.csv("kbo.csv") %>% as_tibble() -> kbo

# 출루율,장타력,ops 변수 만들기
kbo %>% mutate(타율 = 안타/타수,
                 출루율 = (안타+볼넷+사구)/(타수+볼넷+사구+희생플라이),
                 장타력 = 총루타/타수,
                 ops=출루율+장타력) -> kbo2
kbo2

 

OPS가 높은 TOP10 선수를 막대그래프로 나타내기

 

구단별로 막대 색깔 다르게 표현하기

kbo2 %>% 
  arrange(desc(ops)) %>% 
  head(10) %>%  # top10만 선택
  ggplot(aes(x=reorder(이름,ops),y=ops,fill=구단))+ # reorder(이름,ops): 이름을 ops기준으로 배열
  geom_bar(stat="identity") +
  coord_flip() +
  scale_fill_brewer(palette = "OrRd")

fill=구단 옵션을 통해 구단별로 막대 색깔을 다르게 표현가능하다.

scale_fill_brewer 은 Rcolorbrewer 패키지의 brewer 팔레트에 있는 색상을 사용가능하게한다. 

여기선 fill=구단이었으므로 구단을 팔레트 색깔로 표현한다는 의미!

 

geom_bar의 기본값은 stat = "count"이다.  stat = "identity" : y값을 y축 높이로 지정한다는 뜻이다.

y가 categorical 변수였으면 그냥 기본값으로 막대가 그려질 수 있지만,

지금 ops 변수는 실수형 자료이므로 stat="identity" 옵션이 필요하다.

 

하지만 색상도 정신없고 깔끔하지 못한느낌...

TOP10을 표현했지만 1,2위와 10위 선수의 구단이 같아 색깔이 같다보니 

순위가 명확히 눈에 들어오지 않는 느낌이 들었다 그래서 나만의 방식으로 다시 표현해보기로 결정!

 

 

순위별로 색깔 다르게 표현하기

kbo2 %>% 
  arrange(desc(ops)) %>%
  head(10) %>%
  ggplot(aes(x=reorder(이름,ops),y=ops,fill=ops))+ 
  geom_bar(stat="identity") +  
  coord_flip() +
  scale_fill_viridis_c(option = "magma",begin = 0.5, direction = -1)

scale_fill_viridis_(c,d) : continuos, discrete 에 따라 달라짐, 

지금은 fill=ops , ops는 연속형 자료이기 때문에 scale_fill_viridis_c

보통 클수록 색 진한것이 인식하기 쉬우므로 direction = -1 옵션을 통해 순위가 내려갈수록 연하게 표현했다.

 

 

구단명을 text로 표현하기

library(ggrepel) # 텍스트 겹치치 않도록 하는 패키지

kbo2 %>% 
  arrange(desc(ops)) %>%
  head(10) %>%
  ggplot(aes(x=reorder(이름,ops),y=ops,fill=ops,label=paste(구단,format(ops,digits = 3))))+ 
  geom_bar(stat="identity") +
  coord_flip() +
  scale_fill_viridis_c(option = "magma",begin = 0.5, direction = -1)+
  geom_text_repel()

 

label=paste(구단,format(ops,digits = 3)) , 소수점 아래 3자리까지만 출력하라는 의미

geom_text_repel(), 라벨 텍스트끼리 겹쳐지는 것을 막아줌

 

어느정도 완성! 이제 불필요한 부분들을 없애고 다듬어주자!

 

 

x축 y축, title, 범례 다듬기

kbo2 %>% 
  arrange(desc(ops)) %>%
  head(10) %>%
  ggplot(aes(x=reorder(이름,ops),y=ops,fill=ops))+ 
  geom_bar(stat="identity") +
  coord_flip() +
  scale_fill_viridis_c(option = "magma",begin = 0.5, direction = -1)+
  labs(title="2019 프로야구 OPS TOP10", x="", y="")+
  theme(legend.position = "none")+
  geom_text(aes(label=구단), hjust=3.5)+
  geom_text(aes(label=format(ops,digits = 3)), hjust=1.2)
  

labs(title="2019 프로야구 OPS TOP10", x="", y="") , title설정, x축, y축 변수명 삭제

 

theme(legend.position = "none"), 범례(ops 색깔표시) 없애기

 

geom_text(aes(label=구단), hjust=3.5)+

geom_text(aes(label=format(ops,digits = 3)), hjust=1.2) , 위에서 범례가 없어짐에따라 그래프 크기가 바껴 geom_text_repel()을 쓰면 오류가 난다.  따라서 hjust 옵션을 통해 위치를 조정해주었다

 

훨씬 더 깔끔해진 모습!!

하지만 막대길이에따라 구단위치가 다르고 ops값과 함께 나열되어있어 구단이 명확하게 구별되지 않는 느낌을 받았다

 

 

구단명 왼쪽으로 정렬하고 배경 예쁘게 다듬기

kbo2 %>% 
  arrange(desc(ops)) %>%
  head(10) %>%
  ggplot(aes(x=reorder(이름,ops),y=ops,fill=ops))+ 
  geom_bar(stat="identity") +
  coord_flip() +
  scale_fill_viridis_c(option = "magma",begin = 0.5, direction = -1)+
  labs(title="2019 프로야구 OPS TOP10", x="", y="")+
  theme(legend.position = "none",
        panel.grid = element_blank(),
        panel.background = element_blank(), 
        axis.text.x = element_blank(),
        axis.ticks =element_blank())+ # axis.ticks: 눈금
  geom_text(aes(y=0.1,label=구단))+ # y변수로 위치 조정
  geom_text(aes(label=format(ops,digits = 3)), hjust=1.2)

 

geom_text(aes(y=0.1,label=구단)) , 여기서 y=0.1은 label=구단이 놓여질 위치를 말한다. y=ops이므로 ops가 0.1인 곳에 위치하라는 뜻!!

 

최종 막대그래프 완성!

 

 

와플차트

library(waffle)

w = c(S=11, A=33, B=56)
waffle(w)
  
w %>% waffle(rows=5, legend_pos = "top") # legend_pos: 범례 위치

와플차트는 ggplot2 외에도 waffle 패키지가 추가로 필요하다

 

이렇게 영화 좌석표같은 차트를 만들 수 있다! 

 

 


이렇게 첫번째 복습 끝! 

다음에는 롤리팝차트, 덤벨차트, 슬로프 차트 복습을 해보겠다!