R언어 시각화 통계 입문
동그랑땡의 github 자세히보기

동그랑땡의 데이터 데이터 데이터/R 시각화땡 ggplot

R ggplot으로 Slope chart 만들기 geom_segment, geom_text(+ ggplot 한글 깨짐 현상 해결책)

동그랑땡12 2023. 9. 22. 17:08

Slope Chart란?

before after 차이가 있는 경우 그 차이를 간단하고 명확하게 보여주기 위해 사용한다. 나의 경우, 이론값과 실험값의 차이와 그 경향을 보여주기 위해 사용했다. 그러나, 대게 timeline 상에서 변화를 보여주기 위해 많이 사용한다. 아래 예시가 slope graph의 좋은 예시이다.

https://towardsdatascience.com/slope-charts-why-how-11c2a0bc28be

아무튼 본 포스팅은 아래 그래프를 만드는 과정을 담았다.

이걸 만드는 과정이 포스팅에 담겼다.

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 기능을 사용하면서 한글이 깨진다면, 아래 글을 참고해야 한다.

 

[R언어 SOS]RStudio에서 Plot 한글 깨지는 경우 해결책. 맥 mac m1 유저

Plot 출력화면에서 한글이 깨진다. RStudio에서 아래와 같이 plot 출력시 title, label 에 사용한 한글이 깨지는 경우가 있다. barplot(table(Btype), xlab="혈액형", ylab="빈 도 수", main="막대그래프 예제") 해결코

oooo12.tistory.com


데이터 준비

데이터는 개인적으로 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")

맨 우측 class 열에 색 지정.

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의 선 색 지정을 한 바 있다.

맨 우측 class 열에 색 지정.

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

파일 다운로드

 

GitHub - oooo12-git/R_visualizationApplications: R을 활용하여 과제에 활용한 사례

R을 활용하여 과제에 활용한 사례. Contribute to oooo12-git/R_visualizationApplications development by creating an account on GitHub.

github.com

위 링크에서 Flowrate-deltaP 폴더 내 파일 다운로드


참고

 

Top 50 ggplot2 Visualizations - The Master List (With Full R Code)

Top 50 ggplot2 Visualizations - The Master List (With Full R Code) What type of visualization to use for what sort of problem? This tutorial helps you choose the right type of chart for your specific objectives and how to implement it in R using ggplot2. T

r-statistics.co

 

});