ggplot2 :: errorbar 와 point 로 forest plot 그리기

2022. 7. 8. 12:09Statistics/R

errorbar.

추정치와 그 오차 범위를 그림으로 나타낼 때 많이 쓴다.

 

나의 경우는 위험비와 그 confidence interval 을 나타낼 때 많이 쓰고,

errorbar를 이용해서 forest plot을 주로 그리고 있다.

 

forest plot 을 바로 그려주는 여러 패키지 들이 있지만.. 

다른 함수는 컨트롤이 어려워서 ggplot2 :: errorbar와 point 를 이용한다.

 

ggplot2 패키지는 사용이 매우 직관적이면서도 개어렵습... 

뭔가 항상 잘 안된다 =) 


해당 포스팅은 R코드들을 개인적으로 정리하고자 작성하였습니다.

※ 혹시 잘못된 곳이 있거나 의견있으시면 알려주세요!


"survival" package에 있는 'colon' data을 사용

 

forest plot을 그리는 것 다음의 step만 밟으면 나타난다.


 

step 1. HR, upper CI, lower CI를 구한다.

step 2. ggplot으로 plot base를 깐다.

step 3. geom_errorbar로 lower = lower CI / upper = upper CI

step 4. geom_point로 HR를 찍는다.


## step 1.  

이건 분석이라기 보다 그림을 그리기 위함이므로 대충 cox 모형을 돌렸다. (변수 쑤셔넣기)

df <- colon # data 그냥 이름 길어서 저장함

df$age_65 <- ifelse(df$age >= 65, 1, 0)
summary(codph(Surv(time, status) ~ rx + sex + age_65 + node4 + adhere + extent + differ , data = df))

age_65는 그냥.. categorical variable 하나 더 만들고 싶어서....

이제 이 결과에서 HR = exp(coef) / lower CI = lower .95 / upper CI = upper .95  이 세개를 저장해서 plot 을 그릴 것이다.

저장은 알아서 예쁘게 하면 된다. 

 

indexing 을 통해서 긁어와도 되고 excel로 한땀한땀 저장해도 된다.

 

data frame 형식으로 table 저장!

 

그림을 그려봅시다.

## step 2. ggplot 시작하기.

require(ggplot2) #package 불러오기
ggplot(table, aes(y = rownames(table), x = HR))

aes(~ x축, y축이 뭔지 설정해준다.)

보통 y 축을 따로 저장하는 편이기는 한데 이번엔 그림그리는데 문제가 없길래 그대로 rownames를 사용하였다.

이렇게 하면 그래프를 그릴 배경이 나타난다.

 

ggplot base

 

무슨 이유에선지는 모르지만 rowname 순서는 rxLev 로 시작해서 differ 로 끝나는데 y축은 지 맘대로 나타난다. 

기준이 뭘까.. 궁금하지만 깊게 생각해보진 않았다. HR 오름차순 그런건가?

나중에 수정 가능하니 다음스텝 고고 

 

## step 3. geom_errorbar로 lower = lower CI / upper = upper CI

bar 먼저 그리는 이유는 point를 찍고 bar를 그리면

errorbar를 먼저 그리는 이유

이렇게 포인트 위로 라인이 지나가버리기 때문이다.

 

ggplot(table, aes(y = rownames(table), x = HR)) +
	geom_errorbar(aes(xmin = lower, xmax = upper), width = 0.1, size = 1)

size로 가로 선 굵기, width 는

라인 양 끝의 크기를 나타낸다. 나의 경우는 보통 0으로 줘서 아예 없애 버린다.

 

## step 4. geom point 로 HR 찍기

ggplot(table, aes(y = rownames(table), x = HR)) +
	geom_errorbar(aes(xmin = lower, xmax = upper), width = 0, size = 1) +
    geom_point()

사이즈나 모양은 옵션으로 바꾸면 된다. (아래 링크에 들어가면 확인 가능)

https://ggplot2.tidyverse.org/articles/ggplot2-specs.html

 

Aesthetic specifications

Customising how aesthetic specifications are represented on your plot.

ggplot2.tidyverse.org

y축 순서! 사실 이게 간단한 방법인지는 모르겠으나... 아래 방법으로 하면 이름만 바뀌는 게 아니고 해당 errorbar들도 잘 따라오기 때문에 큰 문제는 없다.


▶rev 함수 이용해서 ylim에 지정해주면 원하는 순서대로 등장


ggplot(table, aes(y = rownames(table) , x = HR)) +
   geom_errorbar(aes(xmin = lower, xmax = upper), width = 0, size = 1) +
   geom_point(fill = "royalblue", size = 3, shape = 23)  +
   ylim(rev(rownames(table))

row 순서대로 변경 된 것을 확인 할 수 있다.

일단 그리기는 여기서 끝! 

 

 

 

◎ 긴 글 읽어주셔서 감사합니다.

728x90