Rで数式を書く

plotmath

Rのプロットの中にちょっとした数式を書き込みたいときは expression() という関数を使う。

?plotmath

でヘルプを見ると説明がある。

demo(plotmath)

でデモが見られる。

標準正規分布の分布関数をプロットして,タイトルに $\dfrac{1}{\sqrt{2\pi}} \exp(-x^2/2)$ という数式を書いてみよう。

curve(dnorm(x), xlim=c(-3,3), ylab="",
      main=expression(frac(1,sqrt(2*pi))*exp(-x^2/2)))

私の環境のデフォルトのフォント(ヒラギノ)で何とか数式が表示された。しかし,このフォントではイタリック体がうまく出ない。そこで,フォントをTimesに変えてやってみる。文字 $x$ だけイタリック体にする。

curve(dnorm(x), xlim=c(-3,3), xlab=expression(italic(x)), ylab="",
      main=expression(frac(1,sqrt(2*pi))*exp(-italic(x)^2/2)),
      family="Times")

微妙な違いだが exp(...) を数式扱いではなくテキストとして書くには次のようにする:

curve(dnorm(x), xlim=c(-3,3), ylab="",
      main=expression(paste(frac(1,sqrt(2*pi)), "exp(", -x^2/2, ")")))

このほうが括弧が締まって見えるようにも思う。

expression(...) と同じことだが parse(text="...") とすれば文字列として数式が与えられることを教えていただいた:

curve(dnorm(x), xlim=c(-3,3), ylab="",
      main=parse(text="frac(1,sqrt(2*pi))*exp(-x^2/2)"))

この方法なら数式を表す文字列を sprintf() などで生成することも簡単である。

ほかにも substitute() などがあることを教えていただいた。RjpWikiのグラフィックス参考実例集:数式のプロット参照。

latex2exp

われわれは数式の記法としては $\mathrm{\LaTeX}$ に慣れている。その記法を上記plotmathの記法に変換してくれる TeX() という関数がパッケージ latex2exp により提供されている。これはあくまでplotmathの枠内で数式を書くものであり,新しい機能を追加するものではないが,plotmathの独自記法を覚える必要がないという点で便利である。

install.packages("latex2exp")
library(latex2exp)

詳細はGitHubの stefano-meschiari/latex2exp に解説がある。

これを使えば,このページの最初の例は次のように書くことができる。バックスラッシュは2重に書くことに気をつけなければならない。

curve(dnorm(x), xlim=c(-3,3), xlab=TeX("$x$"), ylab="",
      main=TeX("$\\frac{1}{\\sqrt{2\\pi}}\\exp(-x^2/2)$"))

ただ,文字は自動的にはイタリック体にならない。明示的に \\mathit{x} のように書く必要がある。

curve(dnorm(x), xlim=c(-3,3), xlab=TeX("$\\mathit{x}$"), ylab="",
      main=TeX("$\\frac{1}{\\sqrt{2\\pi}}\\exp(-\\mathit{x}^2/2)$"),
      family="Times")

tikzDevice

本格的な $\mathrm{\LaTeX}$ の数式を書くには,Rの tikzDevice を使えばよい。

TikZの解説は拙著[改訂第6版]LaTeX2e 美文書作成入門の付録Dにある。RでtikzDeviceを使う方法はpp.368-369にある。ここではR-Forgeからインストールするように書かれているが,現在はCRANに入っているので,単に

install.packages("tikzDevice")

でインストールできる。開発はGitHubの yihui/tikzDevice で行われている。

念のため拙著で描いた図を再掲しておく。


Last modified: