해당 포스트에서는 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)