Removing white spaces around plots in R Markdown / Quarto

R
R tips
Author

Philippe Massicotte

Published

August 15, 2022

When plotting spatial data, such as a geographical map, maintaining a proper aspect ratio is important. Whereas knitr::plot_crop() works fine to crop a file, how can we do the same operation for a figure inside an R Markdown or a Quarto document? Thanks to knitr, this can be done with a hook.

Let’s crop something! Photo by Ant Rozetsky on Unsplash

I will use the polygon of Greenland to illustrate the issue.

greenland <-
  ne_countries(
    country = "greenland",
    returnclass = "sf",
    scale = "medium"
  )

# Find a proper projection
proj <- as.numeric(crsuggest::suggest_crs(greenland)$crs_code[1])
proj
#> [1] 5922

If we plot the map, we can see that there are white spaces around the image to keep the proper aspect ratio. This is not a problem per se, but one might be interested to fill up the ploting area with the actual plot.

```{r plot-original}
greenland |>
  ggplot() +
  geom_sf(size = 0.25) +
  coord_sf(crs = proj) +
  theme(
    plot.background = element_rect(fill = "#3c3c3c"),
    panel.border = element_rect(color = "red", fill = NA),
    panel.grid = element_blank(),
    panel.background = element_rect(fill = "#3c3c3c", color = "red"),
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )
```

Now, I will create a hook named crop that is associated with the knitr::hook_pdfcrop() function.

```{r}
knitr::knit_hooks$set(crop = knitr::hook_pdfcrop)
```
Note

Note that the magick package and probably the underlying system library need to be installed on your system to crop images.

With that, we can use crop: true in a code chunk to call it and crop the displayed graph.

```{r plot-cropped}
#| crop: true
greenland |> 
  ggplot() +
  geom_sf(size = 0.25) + 
  coord_sf(crs = proj) +
  theme(
    plot.background = element_rect(fill = "#3c3c3c"),
    panel.border = element_rect(color = "red", fill = NA),
    panel.grid = element_blank(),
    panel.background = element_rect(fill = "#3c3c3c", color = "red"),
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )
```

VoilΓ  πŸ‘, no more borders around the image.

Session info
#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.2.1 (2022-06-23)
#>  os       Linux Mint 21
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en_CA:en
#>  collate  en_CA.UTF-8
#>  ctype    en_CA.UTF-8
#>  tz       America/Montreal
#>  date     2022-08-15
#>  pandoc   2.18 @ /usr/lib/rstudio/bin/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  ! package           * version date (UTC) lib source
#>  P assertthat          0.2.1   2019-03-21 [?] RSPM
#>  P base64enc           0.1-3   2015-07-28 [?] RSPM
#>  P cachem              1.0.6   2021-08-19 [?] RSPM (R 4.2.0)
#>  P callr               3.7.1   2022-07-13 [?] RSPM (R 4.2.1)
#>  P class               7.3-20  2022-01-13 [?] RSPM (R 4.2.0)
#>  P classInt            0.4-7   2022-06-10 [?] RSPM (R 4.2.0)
#>  P cli                 3.3.0   2022-04-25 [?] RSPM (R 4.2.0)
#>  P codetools           0.2-18  2020-11-04 [?] RSPM (R 4.2.0)
#>  P colorspace          2.0-3   2022-02-21 [?] RSPM (R 4.2.0)
#>  P crayon              1.5.1   2022-03-26 [?] RSPM (R 4.2.0)
#>  P crosstalk           1.2.0   2021-11-04 [?] RSPM (R 4.2.0)
#>  P crsuggest           0.4     2022-07-06 [?] RSPM (R 4.2.0)
#>  P DBI                 1.1.3   2022-06-18 [?] RSPM (R 4.2.0)
#>  P devtools            2.4.4   2022-07-20 [?] RSPM (R 4.2.0)
#>  P digest              0.6.29  2021-12-01 [?] RSPM
#>  P dplyr               1.0.9   2022-04-28 [?] RSPM (R 4.2.0)
#>  P e1071               1.7-11  2022-06-07 [?] RSPM (R 4.2.0)
#>  P ellipsis            0.3.2   2021-04-29 [?] RSPM
#>  P evaluate            0.16    2022-08-09 [?] RSPM (R 4.2.1)
#>  P extrafont           0.18    2022-04-12 [?] RSPM (R 4.2.0)
#>  P extrafontdb         1.0     2012-06-11 [?] RSPM (R 4.2.0)
#>  P fansi               1.0.3   2022-03-24 [?] RSPM (R 4.2.0)
#>  P farver              2.1.1   2022-07-06 [?] RSPM (R 4.2.1)
#>  P fastmap             1.1.0   2021-01-25 [?] RSPM
#>  P fs                  1.5.2   2021-12-08 [?] RSPM
#>  P generics            0.1.3   2022-07-05 [?] RSPM (R 4.2.1)
#>  P ggplot2           * 3.3.6   2022-05-03 [?] RSPM (R 4.2.0)
#>  P ggpmthemes        * 0.0.2   2022-08-08 [?] Github (pmassicotte/ggpmthemes@993d61e)
#>  P glue                1.6.2   2022-02-24 [?] RSPM (R 4.2.0)
#>  P gtable              0.3.0   2019-03-25 [?] RSPM
#>  P htmltools           0.5.3   2022-07-18 [?] RSPM (R 4.2.1)
#>  P htmlwidgets         1.5.4   2021-09-08 [?] RSPM (R 4.2.0)
#>  P httpuv              1.6.5   2022-01-05 [?] RSPM (R 4.2.0)
#>  P jsonlite            1.8.0   2022-02-22 [?] RSPM (R 4.2.0)
#>  P KernSmooth          2.23-20 2021-05-03 [?] RSPM (R 4.2.0)
#>  P knitr               1.39    2022-04-26 [?] RSPM (R 4.2.0)
#>  P later               1.3.0   2021-08-18 [?] RSPM (R 4.2.0)
#>  P lattice             0.20-45 2021-09-22 [?] RSPM (R 4.2.0)
#>  P leafem              0.2.0   2022-04-16 [?] CRAN (R 4.2.0)
#>  P leaflet             2.1.1   2022-03-23 [?] RSPM (R 4.2.0)
#>  P lifecycle           1.0.1   2021-09-24 [?] RSPM
#>  P magick              2.7.3   2021-08-18 [?] CRAN (R 4.2.0)
#>  P magrittr            2.0.3   2022-03-30 [?] RSPM (R 4.2.0)
#>  P mapview             2.11.0  2022-04-16 [?] CRAN (R 4.2.0)
#>  P memoise             2.0.1   2021-11-26 [?] RSPM (R 4.2.0)
#>  P mime                0.12    2021-09-28 [?] RSPM
#>  P miniUI              0.1.1.1 2018-05-18 [?] RSPM (R 4.2.0)
#>  P munsell             0.5.0   2018-06-12 [?] RSPM
#>  P pillar              1.8.0   2022-07-18 [?] RSPM (R 4.2.1)
#>  P pkgbuild            1.3.1   2021-12-20 [?] RSPM (R 4.2.0)
#>  P pkgconfig           2.0.3   2019-09-22 [?] RSPM
#>  P pkgload             1.3.0   2022-06-27 [?] RSPM (R 4.2.0)
#>  P png                 0.1-7   2013-12-03 [?] RSPM (R 4.2.0)
#>  P prettyunits         1.1.1   2020-01-24 [?] RSPM
#>  P processx            3.7.0   2022-07-07 [?] RSPM (R 4.2.1)
#>  P profvis             0.3.7   2020-11-02 [?] RSPM (R 4.2.0)
#>  P promises            1.2.0.1 2021-02-11 [?] RSPM (R 4.2.0)
#>  P proxy               0.4-27  2022-06-09 [?] RSPM (R 4.2.0)
#>  P ps                  1.7.1   2022-06-18 [?] RSPM (R 4.2.0)
#>  P purrr               0.3.4   2020-04-17 [?] RSPM
#>  P R6                  2.5.1   2021-08-19 [?] RSPM
#>  P raster              3.5-21  2022-06-27 [?] RSPM (R 4.2.0)
#>  P Rcpp                1.0.9   2022-07-08 [?] RSPM (R 4.2.1)
#>  P remotes             2.4.2   2021-11-30 [?] RSPM (R 4.2.0)
#>    renv                0.15.5  2022-05-26 [1] RSPM (R 4.2.0)
#>  P rlang               1.0.4   2022-07-12 [?] RSPM (R 4.2.1)
#>  P rmarkdown           2.14    2022-04-25 [?] RSPM (R 4.2.0)
#>  P rnaturalearth     * 0.1.0   2017-03-21 [?] RSPM (R 4.2.0)
#>  P rnaturalearthdata * 0.2.0   2022-06-21 [?] Github (ropensci/rnaturalearthdata@352e548)
#>  P rstudioapi          0.13    2020-11-12 [?] RSPM
#>  P Rttf2pt1            1.3.10  2022-02-07 [?] RSPM (R 4.2.0)
#>  P s2                  1.1.0   2022-07-18 [?] RSPM (R 4.2.0)
#>  P satellite           1.0.4   2021-10-12 [?] CRAN (R 4.2.0)
#>  P scales              1.2.0   2022-04-13 [?] RSPM (R 4.2.0)
#>  P sessioninfo         1.2.2   2021-12-06 [?] RSPM (R 4.2.0)
#>  P sf                * 1.0-8   2022-07-14 [?] RSPM (R 4.2.0)
#>  P shiny               1.7.2   2022-07-19 [?] RSPM (R 4.2.1)
#>  P sp                  1.5-0   2022-06-05 [?] RSPM (R 4.2.0)
#>  P stringi             1.7.8   2022-07-11 [?] RSPM (R 4.2.1)
#>  P stringr             1.4.0   2019-02-10 [?] RSPM
#>  P terra               1.6-7   2022-08-07 [?] RSPM (R 4.2.1)
#>  P tibble              3.1.8   2022-07-22 [?] RSPM (R 4.2.1)
#>  P tidyselect          1.1.2   2022-02-21 [?] RSPM (R 4.2.0)
#>  P units               0.8-0   2022-02-05 [?] RSPM (R 4.2.0)
#>  P urlchecker          1.0.1   2021-11-30 [?] RSPM (R 4.2.0)
#>  P usethis             2.1.6   2022-05-25 [?] RSPM (R 4.2.0)
#>  P utf8                1.2.2   2021-07-24 [?] RSPM
#>  P vctrs               0.4.1   2022-04-13 [?] RSPM (R 4.2.0)
#>  P webshot             0.5.3   2022-04-14 [?] CRAN (R 4.2.0)
#>  P withr               2.5.0   2022-03-03 [?] RSPM (R 4.2.0)
#>  P wk                  0.6.0   2022-01-03 [?] RSPM (R 4.2.0)
#>  P xfun                0.32    2022-08-10 [?] RSPM (R 4.2.1)
#>  P xtable              1.8-4   2019-04-21 [?] RSPM (R 4.2.0)
#>  P yaml                2.3.5   2022-02-21 [?] RSPM (R 4.2.0)
#> 
#>  [1] /media/LaCie16TB/work/r-blog/renv/library/R-4.2/x86_64-pc-linux-gnu
#>  [2] /usr/lib/R/library
#> 
#>  P ── Loaded and on-disk path mismatch.
#> 
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────