11.15 高品質なグラフィック (*)

rmarkdown パッケージはそれぞれの出力フォーマットに対して妥当なデフォルトのグラフィックデバイスを設定しています. 例えば HTML 出力に対しては png() を使うので, knitr は PNG 画像ファイルを生成し, PDF 出力に対しては pdf() デバイスを使う, などです. あなたがデフォルトのグラフィックデバイスの品質に不満なら, チャンクオプション dev によって変更することができます. knitr によってサポートされているグラフィックデバイスの一覧は次のようになります. "bmp", "postscript", "pdf", "png", "svg", "jpeg", "pictex", "tiff", "win.metafile", "cairo_pdf", "cairo_ps", "quartz_pdf", "quartz_png", "quartz_jpeg", "quartz_tiff", "quartz_gif", "quartz_psd", "quartz_bmp", "CairoJPEG", "CairoPNG", "CairoPS", "CairoPDF", "CairoSVG", "CairoTIFF", "Cairo_pdf", "Cairo_png", "Cairo_ps", "Cairo_svg", "svglite", "ragg_png", "tikz"

大抵の場合, グラフィックデバイスの名前は関数名でもあります. デバイスについてもっと詳しく知りたいなら, あなたは R のヘルプページを読むことができます. 例えば R コンソールで ?svg と打てば svg デバイスの詳細を知ることができます. このデバイスは base R に含まれています. さらに quartz_XXX デバイスは quartz() 関数を元にしたもので, macOS でのみ有効です. CairoXXX デバイスは Cairo (Urbanek and Horner 2021) パッケージによるアドオンで, Cairo_XXX デバイスは cairoDevice package から39, svglite デバイスは svglite パッケージ (Wickham et al. 2022) から, tikztikzDevice パッケージ (Sharpsteen and Bracken 2020) からのデバイスです. アドオンパッケージ由来のデバイスを使いたいなら, そのパッケージをまずインストールしなければなりません.

大抵はベクタ画像はラスタ画像よりも高品質であり, ベクタ画像は品質を損なうことなく縮尺を変更できます. HTML 出力では, SVG のグラフのために dev = "svg" または dev = "svglite" を使うことを検討してください. SVG はベクタ画像形式で, デフォルトの png デバイスはラスタ画像形式であることに注意してください.

あなたが PDF 出力時のグラフ内の書体に対してこだわりが強い人なら, dev = "tikz" を使うこともできます. これは LaTeX がネイティヴでサポートしているからです. つまり, テキストや記号を含むグラフの全ての要素が LaTeX を介して高品質にレンダリングされるということです. 図11.2に, dev = "tikz" で R のグラフ内で LaTeX 数式表現を書く例を示します.

par(mar = c(4, 4, 2, .1))
curve(dnorm, -3, 3, xlab = '$x$', ylab = '$\\phi(x)$',
      main = 'The density function of $N(0, 1)$')
text(-1, .2, cex = 3, col = 'blue',
  '$\\phi(x)=\\frac{1}{\\sqrt{2\\pi}}e^{\\frac{-x^2}{2}}$')
tikz デバイスでレンダリングされたグラフ

図 11.2: tikz デバイスでレンダリングされたグラフ

base R は実は数式表現をサポートしていますが, LaTeX を介してレンダリングされていないことに注意してください (詳細は ?plotmath を見てください). tikz デバイスの細かい組版を調整するいくつかの発展的なオプションがあります. ?tikzDevice::tikz で, できることを確認できます. 例えばグラフにマルチバイト文字が含まれているなら, 次のオプションを設定するといいでしょう.

options(tikzDefaultEngine = "xetex")

これは, LaTeX 文書でマルチバイト文字を処理する観点では, xetex の方が大抵の場合はデフォルトのエンジン pdftex より優れているからです.

tikz の主な欠点が2つあります. 1つ目は LaTeX のインストールが必要ということですが, これはそこまで深刻ではありません (1.2節参照). 他にもいくつかの LaTeX パッケージが必要になりますが, TinyTeX を使用しているなら簡単にインストールできます.

tinytex::tlmgr_install(c("pgf", "preview", "xcolor"))

2つ目の欠点は, デバイスが LaTeX ファイルを生成してから PDF にコンパイルするため, グラフのレンダリングが顕著に遅くなるということです. コードチャンクに時間がかかると感じるなら, チャンクオプション cache = TRUE でキャッシュを有効にすることもできます (第11.4節参照).

11.2には, チャンクオプション fig.process = pdf2png が使われています. pdf2png11.14節で定義された, 出力フォーマットが LaTeX でない時に PDF 画像を PNG に変換するものです. 変換しない場合, 本書のオンライン版をウエブブラウザで閲覧しても PDF グラフは見られないでしょう.

参考文献

Sharpsteen, Charlie, and Cameron Bracken. 2020. tikzDevice: R Graphics Output in LaTeX Format. https://github.com/daqana/tikzDevice.
Urbanek, Simon, and Jeffrey Horner. 2021. Cairo: R Graphics Device Using Cairo Graphics Library for Creating High-Quality Bitmap (PNG, JPEG, TIFF), Vector (PDF, SVG, PostScript) and Display (X11 and Win32) Output. http://www.rforge.net/Cairo/.
Wickham, Hadley, Lionel Henry, Thomas Lin Pedersen, T Jake Luciani, Matthieu Decorde, and Vaudor Lise. 2022. Svglite: An SVG Graphics Device. https://CRAN.R-project.org/package=svglite.

  1. 訳注: 名前のよく似た cairo_pdf は base R に含まれていることに注意してください.↩︎