본문 바로가기

[R ggplot2] 막대 그래프 기본 (그래프 순서, 텍스트, 그룹별까지)

R Programming/Data Visualization by Mandarim_ 2024. 7. 11.

본 게시글에서는 R의 ggplot2 라이브러리를 사용하여 막대그래프를 그리는 법에 대해 소개한다.

막대 그래프를 그릴 때 가장 많이 사용하는 기능인 (1) 막대 순서 바꾸는 법 (2) 글자 추가하는 법 (3) 적층형 막대그래프 (4) 그룹별 막대그래프를 그리는 법에 대해 소개한다.

 

준비

먼저 필요한 라이브러리와 기본 예시 데이터를 아래와 같이 생성한다.

library(ggplot2)
library(dplyr)

category = c("A", "B", "C", "D")
value = c(10, 30, 5, 20)

df1 <- data.frame(category, value)
df1

#   type value
# 1    A    10
# 2    B    30
# 3    C     5
# 4    D    20

 

기본 막대그래프

ggplot2에서 기본적인 막대 그래프를 그리기 위한 문법 구조는 다음과 같다.

aes()는 df1의 데이터를 사용하여 x축에 category를 y축에 value를 매핑하는 역할을 한다.

geom_bar()의 옵션 중 stat="identity"를 설정하지 않으면, 기본적으로 히스토그램이 출력되기 때문에 각 category 별 값에 해당하는 막대그래프를 그리고 싶다면 "identity"를 작성해줘야 한다.

ggplot(data=df1, aes(x=category, y=value) ) + geom_bar(stat="identity")

기본막대그래프1

 

값의 순서 바꾸기

 

값의 순서를 바꾸기 위해 reoder()함수를 사용하여, 'category'를 'value' 크기에 따라 재정렬할 수 있다.

만약 오름차순이 아닌 내림차순으로 정렬하고 싶다면 값의 순서를 바꿔주기 위해 마이너스(-)를 붙여주면 된다. 

ggplot(data=df1, aes(x=reorder(category, value), y=value) ) + geom_bar(stat="identity") 
ggplot(data=df1, aes(x=reorder(category, -value), y=value) ) + geom_bar(stat="identity")

 

기본 막대그래프 오름차순기본 막대그래프 내림차순

 

 

그래프에 텍스트 추가하기

텍스트 추가하는 아래와 같이 진행할 수 있다.

텍스트의 위치 조정은 y=value+1 처럼 직접 위치 중 y값을 수정하여도 되고, vjust 옵션을 사용할 수도 있다. 

ggplot(data=df1, aes(x=category, y=value) ) + geom_bar(stat="identity") + 
  geom_text(aes(y=value+1, label = value))

ggplot(data=df1, aes(x=reorder(category, -value), y=value) ) + geom_bar(stat="identity") + 
  geom_text(aes(y=value+1, label = value))

 

기본 막대그래프 텍스트 추가기본 막대그래프 텍스트 추가2

 

그룹별 그래프

 

그룹별로 나뉘어지는 막대그래프를 그리기 위해, 아래의 예시 데이터를 다시 생성하였다.

category = rep(c("A", "B", "C", "D"), 2)
value = c(10, 30, 5, 20, 20, 15, 10, 40)
group = rep(c("1", "2"), each=4)

df2 <- data.frame(category, value, group)
df2
#   type value group
# 1    A    10     1
# 2    B    30     1
# 3    C     5     1
# 4    D    20     1
# 5    A    20     2
# 6    B    15     2
# 7    C    10     2
# 8    D    40     2

 

기본 그룹별 그래프

 

나누어 그리고자 하는 값을 fill = group으로 매핑시켜 주면 된다.

기본적으로 x 값에 따라 적층형으로 쌓아서 그려주기 때문에, 만약 옆으로 조정시키고 싶다면 position="dodge" 옵션을 사용하면 된다.

# 적층형
ggplot(data=df2, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity")

# 옆으로
ggplot(data=df2, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity", position="dodge")

 

group bar plot 1

 

텍스트 추가하기

 

적층형 그래프의 경우 y 값을 누적된 값에 맞추어 주어야 하기 때문에, category 별 누적된 값을 생성해주어야 한다.

잘못 작성된 그래프의 예시와 비교해보면 쉽게 이해가 가능하다.

# 잘못 작성된 예시
ggplot(data=df3, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity") + 
  geom_text(aes(y=value, label = value))

# 누적된 값 생성하여 텍스트 추가
df3 <- df2 %>% group_by(category) %>% arrange(desc(group)) %>% mutate( cs = cumsum(value) )
ggplot(data=df3, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity") + 
  geom_text(aes(y=cs+1.5, label = value))

적층형 막대그래프 텍스트 추가 잘못된 예시적층형 막대그래프 텍스트 추가 올바른 예시

 

옆으로 조정시킨 그래프의 경우, 텍스트의 경우도 옆으로 분리시켜주어야 한다.

이를 위해, geom_text에 position 옵션을 사용할 수 있다.

# 잘못 작성된 예시
ggplot(data=df3, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity", position="dodge") + 
  geom_text(aes(y=value+1, label = value))

# position option 사용하여 dodge 설정
ggplot(data=df3, aes(x=category, y=value, fill=group) ) + geom_bar(stat="identity", position="dodge") + 
  geom_text(aes(y=value+1, label = value),  position = position_dodge(width=1))

 

옆으로 분리된 막대그래프 텍스트 추가 잘못된 예시옆으로 분리된 막대그래프 텍스트 추가 올바른 예시
+

반응형