聰明不如鈍筆
총명불여둔필
assignment KindeR

R 그래프에 LaTeX 수식 넣기(feat. latex2exp)


LaTeX이라고 쓰고 /레이텍/ 또는 /라텍/이라고 읽는 논문 문서 저작 도구가 있습니다.


LaTeX를 쓰면 무엇보다 원하는 대로 수식을 넣을 수 있다는 게 제일 큰 장점입니다.


예컨대 '롯데 '가을야구' 진출 확률, 이항분포로 알아보자!' 포스트에 등장하는 수식을 쓰면서 사용한 도구가 바로 LaTeX입니다.


LaTeX는 원래 이동 가능 문서 형식(PDF) 저작 도구에 가까운 게 사실이지만 (거의) 똑같은 공식으로 다양한 문서 형태를 만들 수 있다는 장점도 있습니다.


R에서도 latex2exp 패키지를 통해 LaTeX 문법을 지원하고 있습니다.


지금부터 latex2exp 패키지를 가지고 그래프 위에 LaTeX 수식을 작성하는 방법을 살펴 보도록 하겠습니다.


늘 그랬든 제일 먼저 할 일은 tidyverse 패키지 (설치하고) 불러오기.

#install.packages('tidyverse')
library('tidyverse')
## -- Attaching packages ------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.3.2     √ purrr   0.3.4
## √ tibble  3.0.3     √ dplyr   1.0.2
## √ tidyr   1.1.2     √ stringr 1.4.0
## √ readr   1.3.1     √ forcats 0.5.0
## -- Conflicts ---------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()


원래 R에서는 expression() 함수를 통해 수식 입력을 지원합니다.


예를 들어 그래프 위에 그냥 'x^2'를 쓰라고 입력하면 정말 x^2를 표시하지만


ggplot() +
  annotate(
    geom = 'text',
    x = 0, y = 0,
    size = 12,
    label = 'x^2'
  )


이 x^2를 expresison() 함수 안에 넣으면 $x^2$를 나타냅니다.

ggplot() +
  annotate(
    geom = 'text',
    x = 0, y = 0,
    size = 12,
    label = expression(x^2)
  )
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'


이러면 '패키지가 따로 필요한 이유가 있나'하고 생각하시는 분도 계실 터.


LaTeX 자체가 낯선 분이라면 이런 생각이 잘못된 것도 전혀 아닙니다.


그러나 이 expression() 함수를 활용해 수식을 쓰려면 이 함수에 맞는 문법을 처음부터 다시 배워야 합니다.


반면 LaTeX는 사실상 '업계 표준'이라고 할 만큼 널리 쓰고 있습니다.


그래서 LaTeX 문법을 지원하는 패키지를 따로 만든 겁니다.


이제 latex2exp 패키지를 (설치하고) 불러오도록 하겠습니다.

#install.packages('latex2exp')
library('latex2exp')


LaTeX 문법으로 수식을 적을 때는 TeX() 함수 안에 공식을 적으시면 됩니다.

ggplot() +
  annotate(
    geom = 'text',
    x = 0, y = 0,
    size = 12,
    label = TeX('x^2')
  )
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'


이 정도 수식을 표현할 때는 사실 그냥 expression() 함수를 써도 충분합니다.


난도를 높이는 창원에서 'R로 4할 타자 출현 확률 알아보기(feat. dbinom(), pbinom())' 포스트에 썼던 수식을 그대로 옮겨 보겠습니다.

ggplot() +
  annotate(
    geom = 'text',
    x = 0, y = 0,
    size = 12,
    label = TeX("$_5C_2 (0.3)^2(1-0.3)^3 = 0.3087$")
  )
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'


이렇게 원래 썼던 수식 코드를 있는 그대로 붙여 넣으면 똑같은 결과를 얻을 수 있다는 게 이 패키지를 써야 하는 또 다른 이유입니다.


마찬가지로 인터넷에서 찾은 공식을 그대로 붙여 넣어도 똑같은 결과를 얻을 수 있습니다.


단, LaTeX에서는 원래 \ 뒤에 바로 동사(verb)라고 부르는 표현을 입력하지만 R에서는 \를 하나 더 써서 \\ 다음에 써야 합니다.


R에서는 텍스트 안에서 줄을 바꿀 때 '\n'이라고 쓰는 것처럼 \를 '이스케이프 문자'로 쓰고 있기 때문입니다. 

ggplot() +
  annotate(
    geom = 'text',
    x = 0, y = 0,
    size=8,
    label = TeX("$\\sum_{i=0}^n i^2 = \\frac{(n^2+n)(2n+1)}{6}$")
  )
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'


물론 그래프 안에만 수식을 적을 수 있는 건 아닙니다.


그래프 제목이나 축 제목 같은 곳에도 수식을 써넣을 수 있습니다.

tibble(x=seq(1, 10, 0.1)) %>%
  mutate(y=log10(x)) %>%
  ggplot(aes(x=x, y=y)) +
  geom_line() +
  labs(title=TeX('$y = \\log_{10}x$'),
       subtitle=TeX('$ 0 \\leq x \\leq 10$'))
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'


사실 우리가 흔히 쓰는 LaTeX 문법과 latex2exp 패키지에서 쓰는 문법 사이에 살짝 차이가 나기도 합니다.


≤ 기호는 원래 \le로 표시하는데 latex2exp에서는 \leq라고 써서 살짝 헤맸습니다.


원래 알고 계신 LaTeX 문법이 통하지 않을 때는 아래 코드를 통해 문법을 확인할 수 있습니다.

latex2exp_supported(plot=TRUE)


또 예제를 확인하고 싶으실 때는 아래 코드를 쓰시면 됩니다.

latex2exp_examples()

## [1] TRUE


LaTeX 문법에 대해 조금 더 알아보고 싶으신 분은 이 위키피디아 페이지가 도움이 될 수 있습니다.


그럼 모두들 Happy Charting!


댓글,

KindeR | 카테고리 다른 글 더 보기