Slope Chart란?
before after 차이가 있는 경우 그 차이를 간단하고 명확하게 보여주기 위해 사용한다. 나의 경우, 이론값과 실험값의 차이와 그 경향을 보여주기 위해 사용했다. 그러나, 대게 timeline 상에서 변화를 보여주기 위해 많이 사용한다. 아래 예시가 slope graph의 좋은 예시이다.
아무튼 본 포스팅은 아래 그래프를 만드는 과정을 담았다.
ggplot, scales 라이브러리 사용
본 포스팅에선 Slope chart를 ggplot, scales 라이브러리를 이용하여 만든다.
혹시나 library가 없다면 미리 패키지를 설치하길 바란다.
install.packages("tidyverse")
install.packages("scales")
library(ggplot2)
library(scales)
준비
테마
ggplot의 테마는 가장 많이 사용하는 theme_classic을 사용할 예정이다.
theme_set(theme_classic())
ggplot 한글 깨짐 방지 및 해결 - 테마 설정
만약, plot에 한글이 있다면 깨짐 현상이 일어날 수 있다.
다음과 같이 써야 ggplot을 사용했을때 한글 깨짐을 방지할 수 있다.
theme_set(theme_classic(base_family = 'AppleGothic'))
만약에 R에 내장된 기본적인 plot 기능을 사용하면서 한글이 깨진다면, 아래 글을 참고해야 한다.
데이터 준비
데이터는 개인적으로 plot 하길 원하는 csv자료를 읽어서 df5 객체에 할당했다. df5는 데이터프레임 클래스이고 structure는 아래와 같다.
df5 <- read.csv("Flowrate-deltaP-lam-log.csv")
df5
str(df5)
## 'data.frame': 5 obs. of 7 variables:
## $ expNo : chr "No.1" "No.2.laminar" "No.3.laminar" "No.4" ...
## $ FlowRate : num 2.47 4.97 5.73 11.6 13.27
## $ deltaPtheory : num 579 1165 1345 8695 10972
## $ deltaPexp : num 412 1098 1667 7845 10101
## $ deltaPtheory.LOG: num 2.76 3.07 3.13 3.94 4.04
## $ deltaPexp.LOG : num 2.61 3.04 3.22 3.89 4
## $ X : logi NA NA NA NA NA
왼쪽, 오른쪽 라벨 준비 - paste
deltaP theory 아래 각 slope 마다 'No.5, 10972'와 같이 실험번호(No.5)와 값('10972')을 보여주려 한다.
paste 함수를 이용한다. paste 함수는 벡터를 문자열로 바꿔서 합쳐준다. 이를 left_label에 할당해 주고, deltaP experience 아래 라벨은 right_label에 할당해 주었다.
left_label <- paste(df5$expNo, round(df5$deltaPtheory),sep=", ")
right_label <- paste(df5$expNo, round(df5$deltaPexp),sep=", ")
left_label
## [1] "No.1, 579" "No.2.laminar, 1165" "No.3.laminar, 1345"
## [4] "No.4, 8695" "No.5, 10972"
right_label
## [1] "No.1, 412" "No.2.laminar, 1098" "No.3.laminar, 1667"
## [4] "No.4, 7845" "No.5, 10101"
Slope chart 선 색 지정
df5 데이터 프레임에 새로운 class variable을 만들어서 각 행에 해당하는 색을 지정해 주었다.
df5$class <- c("green","red","red","green","green")
Plot! ggplot으로 그래프 그리기
본격적으로 plotting 하기 전에 본 그래프를 그리기 위해 필요한 ggplot 함수는 다음과 같다.
geom_segment
(x, y)와 (xend, yend) 사이를 잇는 직선을 그리는 함수 aes-aesthetic mapping을 이용하여 geom_segment 함수에 매핑(연결할) 데이터를 정한다.
geom_vline
x intercept를 지나는 vertical line을 그려준다.
scale_color_manual
values 인수에 할당한 벡터가 지정한 색으로 그래프를 칠한다.
아래 예를 보자.
scale_color_manual(values = c("green"="#00ba38", "red"="#f8766d"))
위에서 slope chart의 선 색 지정을 한 바 있다.
scale_color_manual 함수가 class 열의 'green' character를 읽으면 해당 그래프를 "#00ba38#"로 칠해줄 것이다.
여기까지 plot 코드와 결과를 보자.
p <- ggplot(df5) + geom_segment(aes(x=1, xend=2, y=`deltaPtheory.LOG`, yend=`deltaPexp.LOG`, col=class),
linewidth=.75, show.legend=F) +
geom_vline(xintercept=1, linetype="dashed", linewidth=.1) +
geom_vline(xintercept=2, linetype="dashed", linewidth=.1) +
scale_color_manual(values = c("green"="#00ba38", "red"="#f8766d")) +
labs(x="", y="deltaP(log)") + # Axis labels
xlim(.5, 2.5) + ylim(2.5,(1.05*(max(df5$`deltaPtheory.LOG`, df5$`deltaPexp.LOG`)))) # X and Y axis limits
p
아직 완벽하지 않다. 위에서 준비한 왼쪽, 오른쪽 라벨과 타이틀을 넣어보자.
geom_text
geom_text(label=left_label, y=df5$`deltaPtheory.LOG`, x=rep(1, NROW(df5)), hjust=1.1, size=3.5)
geom_text 함수를 이용하여 left_label 객체에 있는 라벨을 달아줄 것이다. [label = left_label]
이 라벨의 y position은 df5 객체에 있는 deltaPtheory.Log에 맞출 것이고 [y=df5$`deltaPtheory.LOG`]
x positon은 1에 둘 것이다. [x=rep(1, NROW(df5))](df5의 행 개수만큼 1을 반복하여 벡터를 만들 것이다. = c(1,1,1,1,1) -'df5'의 행 개수는 5개)
hjust 인수
horizontal justification의 약어. 왼쪽 정렬할 것인지 오른쪽 정렬할 것인지 num로 조절.
size인수
text 크기 조절
p <- p + geom_text(label=left_label, y=df5$`deltaPtheory.LOG`, x=rep(1, NROW(df5)), hjust=1.1, size=3.5)
p <- p + geom_text(label=right_label, y=df5$`deltaPexp.LOG`, x=rep(2, NROW(df5)), hjust=-0.1, size=3.5)
p <- p + geom_text(label="deltaP theory", x=1, y=1.05*(max(df5$`deltaPtheory.LOG`, df5$`deltaPexp.LOG`)), hjust=1.2, size=5) # title
p <- p + geom_text(label="deltaP experience", x=2, y=1.05*(max(df5$`deltaPtheory.LOG`, df5$`deltaPexp.LOG`)), hjust=-0.1, size=5) # title
p
파일 다운로드
위 링크에서 Flowrate-deltaP 폴더 내 파일 다운로드
참고