본 게시글에서는 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")
값의 순서 바꾸기
값의 순서를 바꾸기 위해 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))
그룹별 그래프
그룹별로 나뉘어지는 막대그래프를 그리기 위해, 아래의 예시 데이터를 다시 생성하였다.
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")
텍스트 추가하기
적층형 그래프의 경우 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))
'R Programming > Data Visualization' 카테고리의 다른 글
[R] Error invalid graphics state (1) | 2023.12.20 |
---|---|
[R] ggplot 색 변경 color & palette 설정 (0) | 2023.12.10 |
[R] ggplot legend 범례 설정 (제목, 위치, 글씨) (0) | 2023.12.10 |
[R] 그래프 저장하기 png, jpeg, ggsave (0) | 2023.11.10 |
[R] 그래프 제목에 수식과 문자 함께 넣기: expression, paste (2) | 2023.11.09 |