ggplot2에서 dual y축 사용하기

2018/09/06

ggplot에서 두개의 y축을 사용하는 방법이다.오랫동안 불가능하다고 생각했던 기능인데 의외로 2016년 부터 지원되었던 것 같다.

PKPDdatasets::sd_iv_rich_pkpd 데이타를 사용해서 살펴보았다.

전체 그림

library(tidyverse)
library(PKPDdatasets) # devtools::install_github("dpastoor/PKPDdatasets")

# import data
obs <- PKPDdatasets::sd_iv_rich_pkpd %>% as_tibble()

# show first observations
head(obs)
## # A tibble: 6 x 10
##      ID  TIME   COBS  EOBS WEIGHT   AGE  DOSE SEX    RACE              AMT
##   <int> <dbl>  <dbl> <dbl>  <dbl> <dbl> <int> <chr>  <chr>           <int>
## 1     1   0   0.250  1.43    57.1  50.1     1 Female AfricanAmerican     1
## 2     1   0.5 0.224  0.995   57.1  50.1     1 Female AfricanAmerican     0
## 3     1   1   0.187  0.525   57.1  50.1     1 Female AfricanAmerican     0
## 4     1   2   0.172  0.509   57.1  50.1     1 Female AfricanAmerican     0
## 5     1   4   0.116  0.391   57.1  50.1     1 Female AfricanAmerican     0
## 6     1   6   0.0682 0.225   57.1  50.1     1 Female AfricanAmerican     0
# plot PK
p <- ggplot(obs, aes(x = TIME, group = ID)) +
  geom_line(aes(y = COBS, color = 'PK')) +
  labs(y = "Concentration (PK) or Effect (PD)", 
       x = "Time (h)",
       colour = "Parameter") +
  theme_light()

# add PD
p <- p + geom_line(aes(y = EOBS, color = 'PD'))
p

대략 PK 값의 최대치 (~28) 가 PD 값의 최대치 (~9) 보다 3배 정도 높아보인다.

p2 <- ggplot(obs, aes(x = TIME, group = ID)) +
  geom_line(aes(y = COBS, colour = "PK"))

# adding the relative PD data, transformed to match roughly the range of PK
p2 <- p2 + geom_line(aes(y = EOBS*3, colour = "PD"))

# now adding the secondary axis, following the example in the help file ?scale_y_continuous
# and, very important, reverting the above transformation
p2 <- p2 + scale_y_continuous(sec.axis = sec_axis(~./3, name = "Effect (PD)"))

# modifying colours and theme options
p2 <- p2 + 
  #scale_colour_manual(values = c("blue", "red")) +
  labs(y = "Concentration (PK)",
       x = "Time (h)",
       colour = "Parameter") +
  theme_light()
  #theme(legend.position = c(0.85, 0.85))
p2

왼쪽에는 PK, 오른쪽에는 PD가 표시되어 있다. 큰 차이가 없어보이긴 한다. 그렇지만 PK와 PD의 값 범위가 크게 차이나면 이렇게 그려주는 것이 의미 있는 해석을 이끌어 낼 수도 있다.

개인별 그림

투약 용량과 인종별로 facet을 구성해서 그려보았다.

p +
  facet_grid(paste(DOSE, 'mg') ~ RACE)

p2 +
  facet_grid(paste(DOSE, 'mg') ~ RACE)