해당 포스트에서는 R에서 ggplot2 막대그래프를 출력한 후 텍스트(text labels)를 추가하는 방법에 대해 설명합니다.
1. INTRO
R에서 가장 많이 사용하는 시각화 패키지는 ggplot2로 tidyverse 생태계에 포함되어 있으면서 타 패키지들(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
옵션을 통해 조정할 수 있습니다. vjust
는 vertical 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")
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)
4. 관련 링크
[1] [R] 도수 분포표 및 막대 그래프 그리기 (feat. 혈액형 데이터)
[2] 캘리포니아 주택 가격 예측 - Dataset : California Housing Prices (@Kaggle)