이번 포스팅에서는 R ggplot2 로 y축이 2개 있는 이중 축 그래프 그리는 방법을 소개하겠습니다.

 

엑셀로는 이중 축 그래프 그리기가 그리 어렵지 않은데요, R의 ggplot 도 sec.axis 을 사용하면 두번째 y축을 추가할 수 가 있습니다.

 

먼저 예제로 사용할 데이터셋을 만들어보겠습니다.

 

 

#=========================================
# Dual y-axes plot using ggplot2 sec.axis
#=========================================

rm(list=ls()) # clear all

# make a DataFrame
data_val <- matrix(
  c(-4.2922960, 0.00000000000389755, 0.00000000268579,
  -3.9102123, 0.00000000000939471, 0.00000003082191,
  -3.5281286, 0.00000000002264455, 0.00000027610486,
  -3.1460449, 0.00000000005458189, 0.00000193070482,
  -2.7639612, 0.00000000013156254, 0.00001053865139,
  -2.3818776, 0.00000000031711433, 0.00004490363779,
  -1.9997939, 0.00000000076436268, 0.00014935003987,
  -1.6177102, 0.00000000184239690, 0.00038775418083,
  -1.2356265, 0.00000000444085801, 0.00078584150863,
  -0.8535428, 0.00000001070411038, 0.00124319933681,
  -0.4714591, 0.00000002580086522, 0.00153523161114,
  -0.0893754, 0.00000006218962756, 0.00147990680737,
  0.2927083, 0.00000014989999897, 0.00111358189390,
  0.6747920, 0.00000036131440584, 0.00065408965954,
  1.0568757, 0.00000087090114242, 0.00029990225777,
  1.4389594, 0.00000209919260108, 0.00010733701573,
  1.8210431, 0.00000505982314747, 0.00002998793957,
  2.2031268, 0.00001219600184343, 0.00000653989939,
  2.5852105, 0.00002939662278856, 0.00000111332724,
  3.5852105, 0.00029392734366929, 0.00000000000000,
  4.5852105, 0.00293538878457633, 0.00000000000000,
  5.5852105, 0.02896916461589227, 0.00000000000000,
  6.5852105, 0.25470155892952129, 0.00000000000000,
  7.5852105, 0.94711869936516890, 0.00000000000000,
  8.5852105, 0.99999999999982903, 0.00000000000000,
  9.5852105, 1.00000000000000000, 0.0000000000000),
  nrow=26,
  byrow=TRUE)

# convert a matrix into a dataframe
df <- data.frame(data_val)

# column name
colnames(df) <- c("x", "y1", "y2")

 

> head(df)
          x           y1           y2
1 -4.292296 3.897550e-12 2.685790e-09
2 -3.910212 9.394710e-12 3.082191e-08
3 -3.528129 2.264455e-11 2.761049e-07
4 -3.146045 5.458189e-11 1.930705e-06
5 -2.763961 1.315625e-10 1.053865e-05
6 -2.381878 3.171143e-10 4.490364e-05

 

 

 

두 개 y축의 요약 정보를 보니 최대값의 차이가 매우 크다는 것을 알 수 있습니다. y1 축과 y2 축의 비율을 보니 약 651배 차이가 나네요. 이런 상태에서 그래프를 그리면 y2 축의 그래프가 바닥에 쫙 붙어서 그려지므로 두 축 간의 패턴, 특징, 구조를 비교하기가 어렵게 됩니다. 따라서 y2 축의 데이터를 y1축과 비교하기 쉽도록 y2에 'y1과 y2의 최대값의 비율(max_ratio)'를 곱해서 그래프를 그려보겠습니다.

 

 

> # max ratio b/w 2 axes
> summary(df)
       x                 y1                  y2          
Min.   :-4.2923   Min.   :0.0000000   Min.   :0.000e+00 
1st Qu.:-1.9043   1st Qu.:0.0000000   1st Qu.:7.000e-10 
Median : 0.4838   Median :0.0000003   Median :8.539e-06 
Mean   : 1.1492   Mean   :0.1243873   Mean   :3.020e-04 
3rd Qu.: 3.3352   3rd Qu.:0.0002278   3rd Qu.:3.658e-04 
Max.   : 9.5852   Max.   :1.0000000   Max.   :1.535e-03 
> max_ratio <- max(df$y1)/max(df$y2); max_ratio
[1] 651.367

 

 

 

y1 데이터로는 선 그래프를 그리고, y2 데이터로는 막대그래프를 그려보겠습니다.

이때 y2 에 해당하는 두번째 축의 막대그래프를 그릴 때는

 - (1) max(y1)/max(y2) 로 계산한 두 축의 최대값의 비율인 651을 y2에 곱했으며

       (geom_bar(aes(y = y2*max_ratio) 

 - (2) scale_y_continuous(sec.axis = sec_axis(~.*maxratio, name="y2") 를 사용해서 오른쪽의 두번째 축을 추가하였습니다.

 

 

> # Dual y-axes plot using ggplot2 sec.axis
> library(ggplot2)
> 
> g <- ggplot(df, aes(x = x))
>   g <- g + geom_line(aes(y = y1), colour = "red", size = 2)
>   
>   # adding the relative result5.data.A, 
> # transformed to match roughly the range of the B
> g <- g + geom_bar(aes(y = y2*max_ratio),
> fill = "blue",
> stat = "identity")
> > # adding secondary axis > g <- g + scale_y_continuous(sec.axis = sec_axis(~.*max_ratio, name="y2*651")) > > g

 

 

 

해석하기에 편리하도록 데이터의 소스가 무엇인지를 나타내는 텍스트와 화살표를 추가해보겠습니다.

 

 

> # adding text > g <- g + annotate("text", x = -2, y = 0.75, colour="black", label="y2*651") > g <- g + annotate("text", x = 5, y = 0.5, colour="black", label="y1") > > # adding arrow > library(grid) > g <- g + annotate("segment", x = -1.8, y = 0.75, + xend = -1, yend = 0.6, colour="blue", arrow=arrow()) > g <- g + annotate("segment", x = 5.2, y = 0.5, + xend = 6.7, yend = 0.4, colour="red", arrow=arrow()) > g

 

 

많은 도움이 되었기를 바랍니다.

 

Posted by R Friend R_Friend