티스토리 뷰
R에서 연결된 선이 있는 Bar Plot을 그리는 방법이 있다는 점에 놀라 이 포스팅을 클릭하셨나요? 사실 R에서 연결된 선이 있는 Bar Plot을 그리는 기능은 없습니다. 어떻게 아냐고요? 저도 알고 싶지 않았습니다. 혹시 알고 계신 분이 있다면 댓글을 달아주세요.
그런 의미에서 저는 약간의 트릭을 사용한 방법을 공유하고자 합니다. 중요한 점은 제가 원하는 그래프를 얻었다는 것이겠죠.
우선 필요한 라이브러리를 불러옵니다.
library(dplyr)
library(ggplot2)
library(reshape)
dataset을 만들어줍니다.
> sample <- c(rep("A" , 4) , rep("B" , 4))
> category <- rep(c("level 1" , "level 2" , "level 3", "level 4") , 2) %>%
+ factor(level=c("level 1" , "level 2" , "level 3", "level 4"))
> value <- abs(rnorm(8 , 5 , 10))
> data <- data.frame(sample, category, value)
> data
sample category value
1 A level 1 8.334760
2 A level 2 5.871046
3 A level 3 3.337844
4 A level 4 4.689164
5 B level 1 8.289520
6 B level 2 13.806640
7 B level 3 7.520738
8 B level 4 7.243354
만들어진 데이터셋으로 Default Stacked Bar Plot을 그리면 다음과 같이 됩니다. 저는 이 그래프에서 A와 B의 동일한 category를 선으로 연결을 하고 싶었습니다. 그래서 데이터 값이 더 커지는지 혹은 적어지는지 한눈에 보기 쉽게 말이죠.
> ggplot() +
+ geom_bar(data=data,
+ aes(x=sample, y=value, fill=category),
+ stat="identity", position='stack') +
+ labs(title=sprintf("Stacked Bar Plot with Conected Line"),
+ subtitle=sprintf("From. Chloe"))
하지만 아무리 찾아봐도 geom_bar에서 그런 기능은 없었습니다. 실망스러웠습니다. 굳건히 믿어왔던 ggplot인데요. 그래서 geom_line을 이용해서 그래프를 겹쳐 그려보기도 했지만 무용지물이었습니다. Bar 기둥의 끝에서 선이 시작되지 않고, Bar 중심에서 선이 나오기 때문에 볼품없는 그래프일 뿐이었습니다. 그래서 사용하게 된 트릭은 geom_segment입니다.
우선 geom_segment에 사용할 데이터셋을 만들어야합니다. cast를 이용해서 기존에 만든 데이터를 한번 가공해줍니다. 그 후 데이터의 순서를 역순으로 바꿔주었습니다.
> data_cast <- cast(data, category~sample)
> data_cast
category A B
1 level 1 8.334760 8.289520
2 level 2 5.871046 13.806640
3 level 3 3.337844 7.520738
4 level 4 4.689164 7.243354
> data_segment <- data_cast[rev(seq(nrow(data_cast))),]
> data_segment
category A B
4 level 4 4.689164 7.243354
3 level 3 3.337844 7.520738
2 level 2 5.871046 13.806640
1 level 1 8.334760 8.289520
geom_bar와 geom_segment를 이용해서 둘의 넓이를 맞춰주면 다음과 같이 아름다운 그래프를 그려낼 수 있습니다.
> ggplot() +
+ geom_bar(data=data,
+ aes(x=sample, y=value, fill=category),
+ colour='lightgray', width=0.3, stat="identity", position='stack') +
+ geom_segment(data=data_segment,
+ colour='gray',
+ aes(x=1 + 0.3/2,
+ xend=2 - 0.3/2,
+ y=cumsum(A),
+ yend=cumsum(B))) +
+ labs(title=sprintf("Stacked Bar Plot with Connected Line"),
+ subtitle=sprintf("https://chloe-with-data.tistory.com/")) +
+ theme_minimal() +
+ scale_fill_viridis(discrete = T)
하지만 이 그래프는 Sample수가 2개 일때만 사용할 수 있다는 단점이 있습니다. 이 문제점을 해결할 수 있는 분이 계시다면 댓글로 알려주세요. 감사합니다.
'R' 카테고리의 다른 글
R | reshape2의 melt를 이용한 데이터 재구조화 (0) | 2020.02.14 |
---|---|
R | reshape2의 cast()를 이용한 데이터 재구조화 (1) | 2020.02.05 |
R | 동일한 데이터로 8가지 기본 그래프 그리기 (ggplot) (0) | 2020.01.31 |
R | aggregation을 이용해 그룹별 데이터 합하기 (0) | 2020.01.30 |
R | Clustering된 Heatmap 그리기, pheatmap, (3) | 2020.01.16 |
- Total
- Today
- Yesterday
- BIOINFORMATICS
- covid
- 파이썬
- Visualization
- hist
- 팟빵
- Command
- for loop
- 2진수
- geom_bar
- data
- Python
- Heatmap
- SEQ
- visualizing
- plot
- Excel
- comma
- Coding
- geom_line
- format
- 코로나바이러스
- coronavirus
- 숫자
- Cast
- 데이터
- Order
- 엑셀
- RStudio
- r
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |