[Visualization with R] 1. Bar Chart (막대 그래프)

2023. 9. 7. 12:43·Data Science/Visualization

안녕하세요. R로 하는 시각화 첫번째 포스팅으로 막대 그래프에 대해 알아보려고 합니다.

막대 그래프는 시각화에서 많이 사용하는 그래프 중 하나로 주로 그룹(범주형)별 빈도, 비율, 값을 나타낼 때 많이 사용됩니다.

예를 들면, 부서별 판매실적이나 연령대에 따른 선호도, 실험에 참여한 사람들의 MBTI 빈도를 나타낼 때 효과적입니다.

 

막대그래프는 크게 범주별 빈도를 나타낼 때와 범주에 따른 값이 주어졌을 때 시각적으로 표현할 수 있습니다.

예를 들면, 다음과 같이 Iris의 행을 랜덤으로 추출하였을 때, 종(Species)별 빈도가 어떻게 나타날 지 궁금할 수 있겠죠?

iris_sample <- iris %>% slice_sample(n=50)

해당 데이터에서는 종은 versicolor, setosa, virginica 3종류가 있고 각 행마다 종이 하나씩 나와 있습니다. 이럴 때 두가지 방법으로 접근할 수 있는데요. 첫번째 방법은 geom_bar 함수를 사용해서 바로 시각화 하는 방법이며, 두번째 방법은 종(Species)별 빈도표를 구해서 geom_col 함수에 x축에 올 변수와 y축에 올 변수를 통해 시각화하는 방법입니다.

 

우선 첫번째 방법으로 시각화 한 결과입니다.

iris_sample %>% 
  ggplot(mapping=aes(x=Species)) + geom_bar()

  • 각 geom 함수는 고유의 스탯(Stat)이 존재하는데, geom_bar 함수의 스탯은 stat_count로 주어진 변수의 값들이 몇개씩 있는지 구해서 시각화합니다. 따라서 특별한 작업없이 변수를 입력하면 자동으로 범주별 빈도를 시각화합니다.

두번째는 범주별 빈도수를 구해서 geom_col 함수에 x축에 올 변수와 y축에 올 변수를 입력하는 방법입니다.

iris_sample %>% count(Species)
iris_sample %>% count(Species) %>% 
  ggplot(mapping=aes(x=Species, y=n)) + geom_col()

  • 처음 코드의 결과로 각 종별(Species) 빈도수(n)가 나옵니다.
  • 이를 geom_col 함수에 x축에 Species, y축에 n(빈도)에 넣어서 첫번째 시각화 결과와 같게 됩니다.
  • 참고로 geom_col 함수는 geom_bar(stat="identity")와 동일합니다.

 

간단하게 막대 그래프 생성하는 방법에 대해 알아보았으므로 몇가지 트릭에 대해 서술하겠습니다.

 

1. 범주가 숫자(수치형)인 경우 : factor 함수를 통해 빈 공간을 없애준다.

    (BOD 데이터는 datasets 패키지에 있습니다)

BOD %>% ggplot(mapping=aes(x=Time, y=demand)) + geom_col()
BOD %>% ggplot(mapping=aes(x=factor(Time), y=demand)) + geom_col()

 

2. 막대를 묶어서 표현하기 : position = "dodge"를 사용해서 함께 나란히 표현하기

cabbage_exp %>% 
  ggplot(mapping=aes(x=Date, y=Weight, fill=Cultivar)) + 
  geom_col(position = "stack")

cabbage_exp %>% 
  ggplot(mapping=aes(x=Date, y=Weight, fill=Cultivar)) + 
  geom_col(position = "dodge")

  • dodge는 수직 위치는 유지하지만 수평 위치를 조정하는 함수입니다. 크게 position_dodge, position_dodge2가 있습니다.
  • position_dodge( )는 전역레이어(global layer) 또는 지옴 레이어(geom layer)에 그룹 변수가 명시되어 있어야 합니다.
  • position_dodge2( )는 레이어에 그룹핑 변수가 없어도 작동하며 박스플롯에 주로 사용됩니다.
  • position_dodge(width = NULL, preserve = "total")
  • position_dodge2(width = NULL, preserve = "total", reverse = FALSE)
  • [param] width : Dodging width
  • [param] reverse : if TRUE, will reverse the default stacking order
cabbage_exp %>% 
  slice(1:5) %>% 
  ggplot(mapping=aes(x=Date, y=Weight, fill=Cultivar)) +
  geom_col(position = position_dodge2(preserve = "total"), color="black") +
  scale_fill_brewer(palette = "Pastel1")

cabbage_exp %>% 
  slice(1:5) %>% 
  ggplot(mapping=aes(x=Date, y=Weight, fill=Cultivar)) +
  geom_col(position = position_dodge2(preserve = "single"), color="black") +
  scale_fill_brewer(palette = "Pastel1")

position_dodge2의 파라미터 preserve 차이

3. 막대에 색상 입히기 

  • fill 파라미터는 막대의 색을, color 파라미터는 막대의 테두리 색을 지정합니다.
  • aes 내부에서는 주어진 변수마다 다른 색을 지정하며, aes 외부에서는 일괄적으로 적용합니다.
  • 추가적으로 scale_fill_brewer(palette), scale_fill_manual(values=c(범주1="색상1", 범주2="색상2"))로 색상을 변경할 수 있습니다.
climate %>% 
  filter(Source=="Berkeley", Year>=1900) %>% 
  mutate(pos = ifelse(Anomaly10y>=0, T, F)) %>% 
  ggplot(mapping=aes(x=Year, y=Anomaly10y, fill=pos)) + geom_col()
  
  climate %>% 
  filter(Source=="Berkeley", Year>=1900) %>% 
  mutate(pos = ifelse(Anomaly10y>=0, T, F)) %>% 
  ggplot(mapping=aes(x=Year, y=Anomaly10y, fill=pos)) + geom_col() +
  scale_fill_manual(values=c("TRUE"="red", "FALSE"="blue"), guide="none")

 

저작자표시 (새창열림)

'Data Science > Visualization' 카테고리의 다른 글

ggplot2에서 geom_rect의 투명도(alpha)가 적용되지 않는 이유와 해결법  (0) 2025.03.20
[R] Scatterplot Matrix (산점도행렬)  (0) 2023.09.01
[R] ggplot2 Visualization  (0) 2023.03.29
'Data Science/Visualization' 카테고리의 다른 글
  • ggplot2에서 geom_rect의 투명도(alpha)가 적용되지 않는 이유와 해결법
  • [R] Scatterplot Matrix (산점도행렬)
  • [R] ggplot2 Visualization
임파카
임파카
[ML & Statistics] 모바일 버전에서 수식 오류가 있어 PC 환경에서 접속하는 것을 권장합니다.
  • 임파카
    무기의 스탯(Stat)
    임파카
  • 전체
    오늘
    어제
    • Study (149)
      • Data Science (44)
        • Modeling (18)
        • Manipulation (21)
        • Visualization (4)
      • Statistics (59)
        • Mathmetical Statistics (53)
        • Categorical DA (1)
      • Web Programming (17)
      • AI (26)
        • Machine Learning (16)
        • Deep Learning (10)
      • 활동 및 프로젝트 (3)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
임파카
[Visualization with R] 1. Bar Chart (막대 그래프)
상단으로

티스토리툴바