R による EPS 画像の作成とその LATEX への取り込み

R のグラフィックスを適当な画像形式で保存する基本は postscript() デバイス関数等の画像ファイル出力専用の関数を使うことである。

R でポストスクリプト画像を作る方法

R のポストスクリプトデバイス postscript() 関数で作った EPS 画像は、気をつけないと真正の EPS ファイルにならず、xdvi で表示したり、pdf ファイルに取り込む際トラブルを引き起こす可能性があるので注意が要る。以下の注意を参照。

data(Titanic)
# ポストスクリプトデバイスを開く。出力 EPS ファイル名を指定
# horizontal=FALSE を指定しないと、LATEX に取り込んだ時横にひっくり返る
# オプション onefile = FALSE, paper = special は真正の eps ファイルを作るために不可欠(らしい)
# height = 9, width = 9 は画像のサイズ
# LATEX で表示サイズは後から変えられるので適当で良い
postscript("mosaicplot.eps", horizontal = FALSE, onefile = FALSE, 
           paper = "special", height = 9, width = 9)
mosaicplot(Titanic, main = "Survival on the Titanic", color = TRUE)
dev.off()   # 必要な出力がすべて終ったら、すぐにデバイスを閉じるのがコツ
いろいろ試した結果、次のやりかたがベターと気づきました。このやりかたでは
X11() 画面と別のデバイスに同時に出力できます(2004/5/14)

op <- par(no.readonly = TRUE) # 現在の作図パラメータを退避 
par(bg = "gray94") # 薄いグレイの背景色 
# まず既定の X11 デバイスへ出力
data(Titanic)
mosaicplot(Titanic, main = "Survival on the Titanic", color = TRUE)
# これで良しとなったら、上の作図手順を変数 pp に記録
pp = recordPlot() # 引数なしに注意
# 新しいデバイスを開く(出力 postscript デバイスを指定、他のデバイスでもOK)
# horizontal=FALSE を指定しないと、LATEX に取り込んだ時横にひっくり返る 
postscript("mosaicplot.eps", horizontal = FALSE, onefile = FALSE, 
           paper = "special", height = 9, width = 9)
# postscript デバイスに作図し直す
replayPlot(pp)
dev.off() # 必要な出力がすべて終ったら、すぐにデバイスを閉じるのがコツ
# 終了時に元の作図パラメータを復帰する
par(op) 
# 関数中では on.exit 関数を使うと途中でエラーが起きてもパラメータを復帰してくれるので安心
on.exit(par(op)) 
もう一つのやりかたは、X11 デバイスに表示した後
dev.copy2eps(file="ファイル名")
でその内容を EPS ファイルに落すことです。追加の引数を指定しない限りサイズ等は保たれます。

おまけ(グラフ内の日本語表示について)

日本語表示をするために、 X11デバイスへの出力には

> options(X11fonts = c("-*-gothic-%s-%s-normal--%d-*-*-*-*-*-*-*","-adobe-symbol-*-*-*-*-%d-*-*-*-*-*-*-*"))

としておいて、

> plot(適当な引数)

日本語表示のためにpostscript(EPS画像ファイル)への出力には、

> postscript("output.eps",family="Japan1Ryumin")

としておいて、

> plot(適当な引数)
> dev.off()

LaTeX に EPS 画像を取り込む

\documentclass[a4]{jarticle}
\usepackage{graphicx}   % EPS 画像を取り込むためのおまじない
\begin{document}
......................................
\begin{figure}[ht]
\begin{center}  % 一つのEPS画像を表示 
\includegraphics*[
bb=18 72 594 720,   % EPS 画像ファイルの boundingbox 値 (ファイルの先頭に記録されている,なくともよい)
trim=10 10 15 10, clip,    % 左下右上(この順)から指定量カット (適当な値は試行錯誤で決める,なくともよい)
width=0.5\linewidth,       % 画像の横サイズ指定 (指定しないとEPSファイルそのものの幅になる,指定すると伸縮)
height=0.45\textheight,    % 画像の縦サイズ指定 (同上)
clip]{foo.eps} % EPS 画像ファイル名 (余計な余白をつかないため clip を指定するのがコツ)
\vspace{-5mm}              % 図とキャプションとの隙間調整
\caption{foo の図}         % 図のキャプション
\label{figure:foo}         % 参照用ラベル (後で「第\ref{figure:foo}図」等とする)
\end{center}
\end{figure}
...........................................
\end{document}

画像を切り詰めるには

画像に含まれた枠等の余分なものは、例えば EPS ファイルに変換し、LATEXincludegraphics* 命令で、左右上下から適当な幅クリップすれば消せる(適切な幅を決めるには結構試行錯誤が必要)。

2004-11-22 TK 追記:includegraphics[trim=<左下x> <左下y> <右上x> <右上y>]に指定する座標は,EPSファイルを閲覧できるソフトでEPSファイルを開いて決めるとよい.私の知る限りのWindowsのGSViewでは,マウスポインタがある点の座標は,ウィンドウ下部のステータスバーに表示される.切り出したい矩形の左下の座標と右上の座標を読めばよい.

画像のサイズの指定

なお widthheight はどちらか一方を指定するだけでも良い。その場合はもう一方は自動的に調整される。

2004-11-22 TK 追記:縦横の比率を保った拡大縮小はincludegraphics[keepaspectratio]と明示的に指定してもよい.このオプションを明示した場合にwidthheightの両方を指定するとエラーになる.

バウンディングボックスの値は

バウンディングボックスの値は EPS ファイルの先頭に次のように記録されているので、エディターや less 等のページャで確認する。

%!PS-Adobe-3.0
%%DocumentNeededResources: font Helvetica
%%+ font Helvetica-Bold
%%+ font Helvetica-Oblique
%%+ font Helvetica-BoldOblique
%%+ font Symbol
%%DocumentMedia: letter 612 792 0 () ()
%%Title: R Graphics Output
%%Creator: R Software
%%Pages: (atend)
%%Orientation: Landscape
%%BoundingBox: 18 18 594 774
%%EndComments
(以下略)

追記2010.04.09 Unix には BoundingBox の値を画像ファイルから抜き出す命令がある。Windows 用の命令もあるらしい。参考 参考2 R によるpdf画像のLaTeXでの利用

Unix系だとgrepがあるので特別なプログラムは不要。

$ grep Box hoge.eps 
%%BoundingBox: 0 0 504 504

pdfファイルの場合も同様。

$ strings hoge.pdf |grep Box
/MediaBox [0 0 504 792]

複数の EPS 画像を取り込む

EPS 画像を横に二つ並べて表示する

\begin{figure}[ht]
\begin{center}
\begin{tabular}{@{}c@{}c@{}}  % 二つのEPS画像を横に並べて表示 (@{} は余分な隙間を入れないおまじない)
\includegraphics*[                  % 一つ目の画像
bb=18 72 594 720, trim=10 10 15 10, clip,      
width=0.5\linewidth, height=0.45\textheight, clip]{foo1.eps}                            
& 
\includegraphics*[                  % 二つめの画像
bb=18 72 594 720, trim=10 10 15 10, clip,         
width=0.5\linewidth, height=0.45\textheight, clip]{foo2.eps}
\end{tabular}
\vspace{-5mm}
\caption{foo1(左) と foo2(右) の図}
\end{center}
\end{figure}

EPS 画像を四つ表示する

\begin{figure}[ht]
\begin{center}
\begin{tabular}{@{}c@{}c@{}}  
\includegraphics*[                  % 一つ目の画像
bb=18 72 594 720, trim=10 10 15 10, clip, 
width=0.5\linewidth,  height=0.45\textheight, clip]{foo1.eps}                            
& 
\includegraphics*[                  % 二つ目の画像
bb=18 72 594 720,  trim=10 10 15 10, clip,         
width=0.5\linewidth, height=0.45\textheight, clip]{foo2.eps}
\\
\includegraphics*[                  % 三つ目の画像
bb=18 72 594 720,  trim=10 10 15 10, clip,      
width=0.5\linewidth, height=0.45\textheight, clip]{foo3.eps}                            
& 
\includegraphics*[                  % 四つ目の画像
bb=18 72 594 720, trim=10 10 15 10, clip,         
width=0.5\linewidth, height=0.45\textheight, clip]{foo4.eps}
\end{tabular}
\vspace{-5mm}
\caption{foo1(上左)、 foo2(上右)、foo3(下左) そして foo4(下右) の図}
\end{center}
\end{figure}

画像へのLatex構文の重ね書き

Rにも凡例(legend)を加える機能があるが、細かい指定は困難か、不可能なことがあります。特に数式です。一つの便利な方法は overpic.sty (graphix.styと併用)を使い,画像に Latex の表現を重ね書きすることです。これは Latex の includegraphics 命令と picture 環境を合わせたような機能です。以下に、例をあげておきます。\rule 命令は枠線との隙間を調整しています。重ね書きする位置は \put(x座標値)(y座標値){Latex 表現} で指定します。\begin{overpic}[オプション] のオプションには \includegraphics 命令のオプション以外に overpic 固有のオプションもあります。特にオプション grid は座標位置を決める参考になるグリッド線を表示します。適切な位置が決まればオプション grid を取り除きます。いずれにしても、最適な位置を決めるには試行錯誤が必要です。縦書きテキストを重ね書きしたければ、テキストを \shortstack{縦\\書\\き} のように、\shortstack 命令中に置きます。画像その物を \put(x)(y){\includegraphics*{other.eps}} とすることで、画像に画像を重ねることもできます。 参考URL

\begin{overpic}[
   bb= 0 0 504 504, trim=30 30 30 50, 
   width=0.48\linewidth, height=0.48\linewidth,   
   clip]{abc.eps}
  \put(65,35){\tiny
    \begin{tabular}[t]{|lcr|}                  \hline
      ○:ABC\rule[0pt]{0pt}{5pt}  &$=$ & 0  \\
      △:DEF\rule[-2pt]{0pt}{5pt} &$=$ & +1 \\\hline
    \end{tabular}}
\end{overpic}

テキストや画像を回転したいときは、graphicx.sty に含まれる \rotatebox 命令の中にテキストや画像を置きます。\rotatebox 命令は回転角引数(度、反時計まわり)を持ち,オプションで、箱のどこを回転の中心にするか,回転中心座標、長さの単位系を指定できます。参考URL から書式を引用します。

graphicx : \rotatebox[オプション]{angle}{text}
  (angle 回転させたい角度)
  オプション:
    origin=label
      labelは c, tl, tr, bl, br のいずれかをとり、それぞれ箱の
      中心, 左上, 右上, 左下, 右下を原点として回転します。
    x=dimen,y=dimen
      この座標を原点に回転します。
    units=number
      単位系を変えます。例として下の2つは同じです。
      \rotatebox[origin=c]{30}{text}
      \rotatebox[origin=c,units=6.283185]{0.523583}{text}

参考:この方法は重ねあわせをするため,ドキュメントスタイルを変更したりすると ずれる可能性がある.適当な配置が決まったら,図だけを1ページのPDFファイルに 出力し,単独の画像ファイルにしてから,それを利用するほうが良いかもしれない. latexでPDF画像を利用するには,バウンディングボックスの値をebb命令(Unixの場合) で確認し\includegraphics命令のオプションとして与える必要がある.また一ページ分の 画像になるため,trimオプションで不要な空白を試行錯誤で取り除く必要もある.

(おまけ) 長いキャプションを入れたい

次のように幅を指定した tabular 環境を使用する(オプション [t] を入れるのがこつ):

\caption{
  \begin{tabular}[t]{p{0.8\linewidth}}  % 見栄えの良い長さを試行錯誤で決める
  これはとってもとってもとってもとってもとってもとっても長いキャプション}
  \end{tabular}
}

2004-11-22 TK 追記:次のようにするのが素直な方法かもしれない.

 \caption{\vtop{\hsize=<幅><キャプション>}}

たとえば

 \caption{\vtop{\hsize=30zw% 全角30文字
   これはとってもとってもとってもとってもとってもとっても長いキャプション.
   幅は現在のフォントで全角三十文字としたので,一行にちょうど三十文字のはず
   だけれども,句読点を追い込んだり追い出したりする処理があるのでそうはなら
   ないかもしれない.}}

[一読者]これはとっても便利そう。ありがとうございます。10年前に知っておきたかった。

追記2010.04.09 hangcaption.sty を使えばキャプションのテキスト部分だけを任意指定長さで折り返すことができます。

関連

ツール Sweave を使うと、R コードと LATEX ドキュメントの一体化ができ、画像を含む解析結果を自動的に LATEX ソースファイルに取り込むことができます。論文、定型的レポート等、コードとデータを変えた場合も一発で済みます。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-03-25 (土) 11:19:16