11.14 グラフに後処理をかける (*)

コードチャンクでグラフが生成された後, チャンクオプション fig.process によってグラフに後処理をかけることが出来ます. これはファイルパスを引数にとり, 生成された画像ファイルのパスを返す関数であるべきです. この関数はオプションで第2引数 option を取ることができ, これには現在のチャンクのオプションのリストが与えられます.

R のロゴをグラフに埋め込むために, とても強力な magick パッケージ (Ooms 2021b) を使用する例を以下にお見せします. このパッケージに詳しくないなら, オンラインドキュメントか, 豊富な使用例を含むパッケージのヴィネットをを読むことをお薦めします. 初めに, 関数 add_logo() を定義します.

add_logo <- function(path, options) {
  # コードチャンクで作成された画像
  img <- magick::image_read(path)
  # R のロゴ
  logo <- file.path(R.home("doc"), "html", "logo.jpg")
  logo <- magick::image_read(logo)
  # デフォルトの重心は `northwest` (左上) で,
  # ユーザーはチャンクオプション `magick.gravity`
  # で変更できる
  if (is.null(g <- options$magick.gravity))
    g <- "northwest"
  # ロゴを画像に追加する
  img <- magick::image_composite(img, logo, gravity = g)
  # 新しい画像を書き出す
  magick::image_write(img, path)
  path
}

基本的にこの関数は R のグラフのパスをとり, R のロゴを追加し, 元画像のパスに新しい画像を保存します. デフォルトでは, ロゴはグラフの左上 (northwest) の隅に追加されますが, ユーザーはカスタムチャンクオプション magick.gravity で位置をカスタマイズできます. このオプション名は任意に決められます.

では上記の処理関数を fig.process = add_logomagick.gravity = "northwest" オプションで以下のコードチャンクに適用します. よってロゴは右上の隅に追加されます. 実際の出力は図11.1になります.

par(mar = c(4, 4, 0.1, 0.1))
hist(faithful$eruptions, breaks = 30, main = "", col = "gray",
  border = "white")
チャンクオプション fig.process でグラフに R のロゴを追加する

図 11.1: チャンクオプション fig.process でグラフに R のロゴを追加する

あなたが magick パッケージにより詳しくなったら, R のグラフに後処理をするための, より創造的で有用なアイディアを思いつくことでしょう.

最後に, fig.process オプションのもう1つの応用例をお見せします. 以下の pdf2png() 関数は PDF 画像を PNG に変換します. 第11.15節ではグラフの生成のために tikz グラフィックデバイスを使用する例を見せました. この方法の問題は, デバイスが PDF を生成するため, LaTeX 以外の出力文書に対しては機能しないということです. チャンクオプション dev = "tikz"fig.process = pdf2png を使えば, グラフの PNG 版を図11.2に示すことができます.

pdf2png <- function(path) {
  # LaTeX でない出力に対してのみ変換する
  if (knitr::is_latex_output())
    return(path)
  path2 <- xfun::with_ext(path, "png")
  img <- magick::image_read_pdf(path)
  magick::image_write(img, path2, format = "png")
  path2
}

参考文献

———. 2021b. Magick: Advanced Graphics and Image-Processing in r.