티스토리 뷰
하나의 데이터도 전달하는 자의 의도에 따라 다양한 그래프로 표현이 가능합니다. 그래서 어떤 그래프 형태를 이용해야 더 효과적으로 의미를 전달할 수 있을까 항상 고민을 하게 되는것 같습니다. 간혹 인터넷에서 통계자료를 보면서 기발한 아이디어를 얻기도 하고, 때로는 저 그래프보다는 다른 형식이 더 좋았을텐데 하고 아쉬움이 들기도 합니다.
그럼 R의 강력한 visualizing 패키지인 ggplot을 이용해서 기본 8가지 그래프 그리기를 해보겠습니다.
[ ggplot ]
1. geom_bar()
2. geom_area()
3. geom_line()
4. geom_point()
우선 이번에 사용할 라이브러리를 불러옵니다.
library(viridis)
library(ggplot2)
library(dplyr)
연습 데이터를 만들었는데 주의할 부분은 course_level을 factor로 지정해서 level을 설정하는 부분입니다.
# create a dataset
course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3))
course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3) %>%
factor(level=c("Basic" , "Advanced" , "Expert"))
value <- abs(rnorm(9 , 5 , 10))
data <- data.frame(course, course_level, value)
> data
course level value
1 A Basic 1.4410656
2 A Advanced 17.4094036
3 A Expert 0.8543571
4 B Basic 5.2130577
5 B Advanced 8.5235640
6 B Expert 9.0098816
7 C Basic 6.7049045
8 C Advanced 16.8246703
9 C Expert 6.9517427
※ TIP
데이터 셋을 만들 때 별도로 level을 지정하지 않으면 알파벳 순서로 level이 자동 지정됩니다. 그러면 다음과 같이 Advanced > Basic > Expert 가 되어서 원치 않는 그래프가 그려지게 됩니다.
# level 지정하지 않았을때
> course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3))
> course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3)
> value <- abs(rnorm(9 , 5 , 10))
> data <- data.frame(course, course_level, value)
> levels(data$course_level)
[1] "Advanced" "Basic" "Expert"
# level 지정 했을때
> course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3))
> course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3) %>%
+ factor(level=c("Basic" , "Advanced" , "Expert"))
> value <- abs(rnorm(9 , 5 , 10))
> data <- data.frame(course, course_level, value)
> levels(data$course_level)
[1] "Basic" "Advanced" "Expert"
1. geom_bar()
geom_bar를 이용해서는 첫번째 그래프와 같이 course 그룹별로 묶을 수 있습니다. level 수가 적을때는 좋을지 몰라도 level이 많아지면 한눈에 들어오는 그래프는 아닐것 같습니다. 거기에서 두번째 그래프와 같이 bar기둥을 위로 올려 쌓(stack)을 수도 있습니다. 이렇게 되면 각 course별로 전체 value값의 비교도 쉬워지겠지요. 한걸음 더 나아가서 세로축을 100% 비율로 맞춰 주면 각 course별 value 값에 상관없이 value 비율을 비교하기에 적합한 그래프가 그려집니다.
# Grouped
ggplot(data, aes(x=course, y=value, fill=course_level)) +
geom_bar(position='dodge', stat='identity') +
scale_fill_viridis(discrete = T) +
theme_minimal()
# Stacked
ggplot(data, aes(x=course, y=value, fill=course_level)) +
geom_bar(position="stack", stat="identity") +
scale_fill_viridis(discrete = T) +
theme_minimal()
# Stacked + percent
ggplot(data, aes(x=course, y=value, fill=course_level)) +
geom_bar(position="fill", stat="identity") +
scale_fill_viridis(discrete = T) +
theme_minimal()
2. geom_area()
geom_area를 이용해서는 다음 course로 넘어감에 따라 level 변화의 추세를 볼 수 있습니다. 시간과 관련된 데이터에 적합한 방법이 될 수 있겠습니다. bar 그래프와 마찬가지로 세로축을 100% 로 맞춰 비율을 볼 수도 있습니다.
# Area
ggplot(data, aes(x=course, y=value, group=level, fill=course_level)) +
geom_area(stat="identity", position='stack') +
scale_fill_viridis(discrete = T) +
theme_minimal()
# Area + percent
ggplot(data, aes(x=course, y=value, group=level, fill=course_level)) +
geom_area(stat="identity", position='fill') +
scale_fill_viridis(discrete = T) +
theme_minimal()
3. geom_line()
4. geom_point()
geom_line과 geom_point는 각각 따로 이용할 수도 있지만 경우에 따라 함께 그려서 더 좋은 그래프를 그릴 수도 있습니다.
# Line
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) +
geom_line() +
scale_fill_viridis(discrete = T) +
theme_minimal()
# Dot
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) +
geom_point() +
scale_fill_viridis(discrete = T) +
theme_minimal()
# Line + Dot
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) +
geom_point() +
geom_line() +
scale_fill_viridis(discrete = T) +
theme_minimal()
가장 마음에 드는 그래프는 어떤 그래프인가요?
'R' 카테고리의 다른 글
R | reshape2의 cast()를 이용한 데이터 재구조화 (1) | 2020.02.05 |
---|---|
R | 연결된 선이 있는 Bar Plot 그리기(2 samples) (0) | 2020.01.31 |
R | aggregation을 이용해 그룹별 데이터 합하기 (0) | 2020.01.30 |
R | Clustering된 Heatmap 그리기, pheatmap, (3) | 2020.01.16 |
R | 꼭 알아야할 RStudio기능, 스크립트 빠르게 수정하기, (Crtl + F) (1) | 2020.01.15 |
- Total
- Today
- Yesterday
- BIOINFORMATICS
- format
- Order
- geom_line
- Visualization
- coronavirus
- data
- plot
- covid
- RStudio
- geom_bar
- r
- Command
- 숫자
- for loop
- Excel
- hist
- Coding
- Python
- 코로나바이러스
- 파이썬
- 데이터
- visualizing
- 2진수
- 팟빵
- Heatmap
- SEQ
- 엑셀
- Cast
- comma
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |