2009年03月23日

Rで描いたグラフ中の数式をLaTeXで書き換える[R]

Rで図中に数式を書きたい場合はexpression()やpaste()なんかを使って頑張るんだけど、 これが結構複雑で面倒な上に出力が汚い。そこで、Rで数式を書くのはあきらめて、数式の部分だけ後でLaTeXの力を借りて書き直す、 という方法を採るときれいなグラフが得られる。

今回、手順としては「PS形式でグラフを作る」→「PSfragでテキストを数式に置換」→「LaTeXで処理」という形をとる。

まー結局はPSfragの使い方なのでRに限った話じゃなくてps/epsファイル全般の話になりますが。

それではお手元にRとLaTeXの環境を用意してご覧下さい。

1.PSfragを準備

まず、PSfragを入手しないといけないのだけど、何か僕の環境にはすでに入っていたのでTeXインストーラーなどを使ってLaTeX一式をまとめてインストールした場合に一緒にインストールされるものに含まれているのだと思う (便利ですねインストーラー!)。もしなかったらCTANなどを探して拾ってきてパスの通った場所に置く。 (この辺正直詳しいことがわからないので聞かないで下さい><)

2.グラフの準備

グラフを準備する。先月作ったデルタ関数のグラフを使いまわそう。

アレは次のようにして描いた。

#余白設定
par(mar=c(3,3,3,1), mgp=c(2,1,0))
#関数定義
Delta <- function(a, x){
 a <- complex(imaginary=1/a)
 Im((pi*(x-a))^-1)
 }
#プロット
curve(Delta(7.5,x), -2, 2, ylim=c(0,10),
main=expression(lim(paste(Im, over(1, pi(x-ia))), a %->% 0)),
xlab="x",
ylab=expression(paste(delta, (x))),
col=1)
par(new=T)
curve(Delta(15,x),  -2, 2, ylim=c(0,10),main="",xlab="",ylab="",col=2)
par(new=T)
curve(Delta(30,x),  -2, 2, ylim=c(0,10),main="",xlab="",ylab="",col=3)
#凡例
legend(
0.5, 10,
box.lty=0,
legend=c(
expression(paste(a=7.5^-1)),
expression(paste(a=15^-1)),
expression(paste(a=30^-1))
),
col=1:3,
lty=c(1,1,1)
)

こんなのが描ける。

delta1

…やっぱ数式が汚い。

で、せっかく頑張って作ったこのグラフは使えない。PSfragはPSファイル中のテキストを認識して置換するので、 次のようにしてタイトルや軸ラベルをテキストにしたグラフを作らないといけない。

#プロット
curve(Delta(7.5,x), -2, 2, ylim=c(0,10),
main="main.title",
xlab="xlab",
ylab="ylab",
col=1)
par(new=T)
curve(Delta(15,x),  -2, 2, ylim=c(0,10),main="",xlab="",ylab="",col=2)
par(new=T)
curve(Delta(30,x),  -2, 2, ylim=c(0,10),main="",xlab="",ylab="",col=3)
#凡例
legend(
0.5, 10,
box.lty=0,
legend=c(
"l1",
"l2",
"l3"
),
col=1:3,
lty=c(1,1,1)
)

次のようなグラフが得られる。

delta2

ただこれはpng。PSfragが処理できるのはps/epsファイル。 なのでたとえばデバイスをpostscriptにするとか、Windowsのデフォルトのグラフィックデバイスから 「ファイル」→ 「別名で保存」→「postscript」するなどしてepsとして保存しておく。

他に注意として、置換は文字の先頭位置を基準に行われる。なのでたとえばタイトル部分を省略して「t」一文字などにしておくと、 そこを基点に数式が挿入されるのでちょっと右よりになってしまう。

3.LaTeXで処理

パッケージとして呼び出すのはpsfragのほかにgraphicxも必要。psファイルを描く必要があるので。

psfragの使い方は

\psfrag{置換前テキスト}{置換後テキスト}

とこれだけ(オプションも指定できるけど省略)。このコマンドでテキストを置換した後、 psファイルを呼び出してやると置換後の状態で描画される。 置換後のテキスト部分には$$などを用いてLaTeXでいつもやるように数式が書ける。

なので、今の例で行くと次のようなファイルを作る。ここではtexファイルと同じディレクトリに「delta.eps」 という名前で先ほどのpsファイルが保存してある。

\documentclass{jsarticle}
\usepackage[dvips]{graphicx,psfrag}  %パッケージ:graphicx,psfrag
\begin{document}
 \psfrag{main.title}{
$\displaystyle \lim_{a\rightarrow0} \Im \frac{1}{\pi(x-ia)}$
}                                  %テキストの置換
 \psfrag{xlab}{$x$軸}
 \psfrag{ylab}{$\delta (x)$}
 \psfrag{l1}{$7.5^{-1}$}
 \psfrag{l2}{$15^{-1}$}
 \psfrag{l3}{$30^{-1}$}
 \includegraphics[scale=1]{delta}    %epsファイルの呼び出し
\end{document}

で、これをTeXで処理する。dviファイルの段階ではまだ置換は行われず、psファイルまで変換して初めて置換が行われるのに注意。

で、psファイルまで変換が終わると次の出力が得られるはず。

delta

今15分くらいでパパっと作ったので若干フォントのサイズや種類のバランスが悪いけど、とりあえず置換はできた。簡単!

Rの出力に比べてずいぶんきれいだし、あと数式部分のソースも読みやすく書きやすいと思う。 LaTeXだとドイツ文字のIとか使えていかにもそれっぽいね!

posted by Rion778 at 01:35 | Comment(0) | TrackBack(0) | PC関連。HTMLとか,Linuxとか,Rとか | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL(言及がない、関連がないと判断した場合削除することがあります)
http://blog.seesaa.jp/tb/116077473
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。