[R] ggplot2 막대그래프(barchart)에 텍스트 추가하기

r-ggplot2-barchart-add-text

해당 포스트에서는 R에서 ggplot2 막대그래프를 출력한 후 텍스트(text labels)를 추가하는 방법에 대해 설명합니다.

1. INTRO

R에서 가장 많이 사용하는 시각화 패키지는 ggplot2tidyverse 생태계에 포함되어 있으면서 타 패키지들(dplyr, tidyr 등)과의 연동성 및 시각화 종류, 품질 등에 장점을 가집니다. 해당 포스트에서는 ggplot2 패키지를 이용하여 출력된 막대그래프에 텍스트 정보(빈도수)를 추가하는 방법에 대해 설명합니다.

 

 

2. 데이터 생성

이번 설명에서 사용할 샘플 데이터를 생성합니다. 아래 코드는 알파벳 A부터 F까지의 총 6개 문자를 랜덤하게 300번 복원 추출하여 data에 저장합니다.

  • LETTERS : 알파벳 A부터 Z까지의 문자가 들어있는 시스템 변수로 인덱스를 이용하여 문자 추출 가능
  • sample() : 랜덤 추출 함수로 시스템 내장 함수이며, replace 옵션을 통해 복원 추출 또는 비복원 추출 선택 가능
set.seed(123)
data <- data.frame(x = sample(LETTERS[1:6], 300, replace = TRUE))
head(data)
  x
1 C
2 F
3 C
4 B
5 B
6 F
dim(data)
[1] 300   1

 

3. geom_text() 활용

ggplot2로 출력한 그래프에 텍스트(text labels))을 추가하기 위해서는 geom_text() 함수를 이용하면 됩니다. geom_text() 함수를 이용할 때에는 x, y, text에 대한 정보를 사전에 맵핑(mapping)하는 작업이 필요합니다.

텍스트(text) 출력 위치는 vjust 옵션을 통해 조정할 수 있습니다. vjustvertical justification으로 세로축 방향의 조정이 가능합니다.

1) stat 옵션을 활용한 빈도(count) 정보 표현

아래 코드는 geom_bar() 함수로 출력한 그래프에 빈도수(count)를 추가하면서 vjust 옵션으로는 출력 위치를, colour 옵션으로는 폰트의 색상을 설정합니다.

stat옵션으로 통계 정보(count) 사용을 지정하고 label 옵션에 빈도 계산값을 ..count..의 형태로 입력해 주면 됩니다.

library(ggplot2)

ggplot(data, aes(x = factor(x), fill = factor(x))) +
  geom_bar() +
  geom_text(aes(label = ..count..), stat = "count", vjust = 1.5, colour = "white")

r-ggplot2-barchart-geomtext
▲ ggplot2에서 제공하는 통계량 산출 함수를 활용한 시각화 예시

 

2) 빈도(count) 값이 이미 데이터에 포함된 경우

만약 빈도(count) 값이 이미 계산되어 데이터에 들어있다면 해당 변수를 사용하여 출력할 수 있습니다.

위에서 생성한 코드를 변형하여 변수(Var1)별 빈도(Freq)를 가지는 data1이라는 새로운 데이터를 생성합니다.

data1 <- as.data.frame(table(data$x))      
data1
   Var1 Freq
1    A   56
2    B   52
3    C   43
4    D   39
5    E   58
6    F   52


위와 같은 데이터가 있다고 했을 때, ggplot2 막대 그래프(bar chart)를 출력하고 텍스트(text labels) 정보를 추가하는 코드는 아래와 같습니다.

geom_text()label옵션에 ..count..가 아닌 Freq라는 변수명을 맵핑(mapping)한 부분과 vjust 옵션에 0을 입력하면 막대그래프(bar chart) 상단에 텍스트가 붙어서 출력된다는 것을 참고하시면 됩니다.

ggplot(data1, aes(x = Var1, y = Freq, fill = Var1)) + 
  geom_bar(stat = "identity") +
  geom_text(aes(label = Freq), vjust = 0)

r-ggplot2-barchart-using-summarise
▲ 빈도값이 데이터에 포함된 경우의 시각화 예시

 

4. 관련 링크

[1] [R] 도수 분포표 및 막대 그래프 그리기 (feat. 혈액형 데이터)
[2] 캘리포니아 주택 가격 예측 - Dataset : California Housing Prices (@Kaggle)