R Markdown で coord_fixed な ggplot2 の余白を取り除く

by
カテゴリ:
タグ:

R Markdown ではグラフのサイズを fig.widthfig.height で指定できる。

通常はここで指定したサイズを最大限に利用してグラフを描写するので、無駄な余白は生じない。

ggplot2 の僅かな余白を消したければ + theme(plot.margin = unit(c(0, 0, 0, 0), "mm")) とすればよい。

ただし、coord_fixed()coord_equal() を使って縦横比を固定すると、使い切れない領域が余白として残る (例えば下図の黒帯)。

```{r plot, dev.args=list(bg="black"), fig.width = 2.5, fig.height = 2}
library(ggplot2)
qplot(1:3, 1:3) + coord_equal()
```

ちなみに、この黒帯部分は theme(plot.background) の外に見えるグラフィックデバイスの背景色である。

余白をなくすために、サイズ調整を試行錯誤するのは非効率なので、Chunk オプションの fig.process を使おう。

fig.process にはグラフを画像として加工するための関数を指定できる。関数は画像として保存されたグラフのファイルパスを引数として受け取り、新しいパスを返す必要がある。

画像の加工に imager パッケージを使うなら、以下のように 画像読み込み画像のクロップ画像の保存画像のパスを返す という段階を踏めばよい。

library(imager)
library(magrittr)
fig_crop <- function(x) {
  x %>%
    imager::load.image() %>%
    imager::autocrop(c(0, 0, 0)) %>%
    imager::save.image(x)
  x
}

余白を削除するための関数は autocrop で、ここには RGB の強度をそれぞれ0から1で表現した流さ3のベクトルを指定する。デバイスの背景色は通常白なので、 c(1, 1, 1) とするのが簡便だろう。うっかり theme(plot.margin) まで消してしまわないようするなら、チャンクオプションでプロットの背景色と異なる色をデバイスの背景に指定し (例えば dev.arg=list(bg="black"))、その色を autocrop() する色にも指定する (c(0, 0, 0))。

この関数を fig.process=fig_crop といった具合にチャンクオプションに指定すると、余分な余白が消えたグラフを得ることができる。

```{r plot-cropped, dev.args=list(bg="black"), fig.width = 2.5, fig.height = 2, fig.process=fig_crop}
qplot(1:3, 1:3) + coord_equal()
```

Enjoy!