Skip to contents
# Setting the dev to ragg_png is important

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  dev = "ragg_png"
)

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
##  dplyr     1.1.4      readr     2.1.5
##  forcats   1.0.0      stringr   1.5.1
##  ggplot2   3.5.1      tibble    3.2.1
##  lubridate 1.9.3      tidyr     1.3.1
##  purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
##  dplyr::filter() masks stats::filter()
##  dplyr::lag()    masks stats::lag()
##  Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(patchwork)
library(ggrrr)

out = outputter(normalizePath(tempdir(), mustWork = FALSE),datedFile = FALSE,datedSubdirectory = FALSE)
## directing output to: /tmp/RtmpXQ5QHz

Opinionated defaults for figures

ggrrr sets a default theme and overrides default line sizes and text sizes to base figures around 8pt sans serif labels.


ggrrr::gg_pedantic()
plot = ggplot(diamonds, aes(x=carat,y=price,color = color))+
  geom_point()+annotate("label",x=2,y=10000,label="Hello \u2014 world", family="Kings")+labs(tag = "A")+xlab("Carat\u2082")+ylab("price\u2265")
plot

There are utility functions to switch off various bits of the plot

to control the legend size, arrange the plot to fit a narrower space and put a watermark in the plot

plot+gg_narrow()+gg_resize_legend(spaceLegend = 1,pointSize = 4,textSize = 12)+gg_watermark("PRELIM")

Tabular data in ggplots

A simple table as a ggplot grob makes it easier to combine plots and tables. This simple table has very little control on the output.

tableExample = diamonds %>% 
  mutate(size = cut(carat, breaks=c(-Inf,quantile(carat, probs = c(0.25,0.75)),Inf), labels=c("small","medium","large")) %>% as.factor()) %>%
  group_by(size,cut) %>%
  summarise(
    N = n(),
    depth = sprintf_list("%1.2f (IQR %1.2f \u2014 %1.2f)", quantile(depth,c(0.5,0.25,0.75))),
    price = sprintf_list("%1.0f (IQR %1.0f \u2014 %1.0f)", quantile(price,c(0.5,0.25,0.75)))
  )
#> `summarise()` has grouped output by 'size'. You can override using the
#> `.groups` argument.
  

tbl = tableExample %>% gg_simple_table(font = "Roboto")
p2 = plot+tbl+labs(tag = "B")+patchwork::plot_layout(ncol=1)
p2

Fixed sizes for save

Previewing ggplots in RStudio resizes the plot to fit the windows, scaling the labels independently of the plot. This is annoying when you are designing a plot for publication and the label sizes change with the size of the overall image. ggrrr can force ggplot to render it at the size it will be printed at. In doing so it produces both a PNG and PDF output which will be (very nearly) identical. It also by default saves an .Rdata of the ggplot object allowing later adjustment.

f = out("figure1")
tmp = p2 %>% gg_save_as(out("figure1"),size = std_size$two_third)
as.character(tmp)
#> [1] "a ggplot with 3 outputs:"         "svg: /tmp/RtmpXQ5QHz/figure1.svg"
#> [3] "pdf: /tmp/RtmpXQ5QHz/figure1.pdf" "png: /tmp/RtmpXQ5QHz/figure1.png"

In general journals don’t like this mixture of figures and tables however simple tables are also good to add as annotations to a plot. For this annotating an unwrapped grob is needed e.g.:

tableExample2 = diamonds %>% 
  mutate(size = cut(carat, breaks=c(-Inf,quantile(carat, probs = c(0.25,0.75)),Inf), labels=c("small","medium","large")) %>% as.factor()) %>%
  group_by(size) %>%
  summarise(
    N = n(),
    depth = sprintf_list("%1.2f (IQR %1.2f \u2014 %1.2f)", quantile(depth,c(0.5,0.25,0.75))),
    price = sprintf_list("%1.0f (IQR %1.0f \u2014 %1.0f)", quantile(price,c(0.5,0.25,0.75)))
  )

tbl2 = tableExample2 %>% gg_simple_table(font = "Roboto",unwrapped = TRUE)
plot+annotation_custom(tbl2)

laying these tables out is tricky, and is worth looking at the ggpp package for assistance.

Scaling tables to fit

A more complex tabular layout can be achieved which auto scales text to fit the specific dimensions provided.


# tableExample %>% as.long_format_table(fontName = "Times New Roman",fontSize = 12) %>% glimpse()
# tablePlot = tableExample %>% gg_formatted_table(tableWidthInches = 4,font = "Roboto",fontSize = 8)
# tablePlot %>% gg_save_as(tempfile(),maxWidth = 4)
# colwidths not being populated in as.long_format_table