Une des fonctionnalités récentes du package flextable est la capacité à travailler avec un format ‘grid graphics’. La fonction gen_grob() génére un ‘grob’ (Graphical Object) à partir d’un flextable, ce dernier peut ensuite être ajouté à un graphique ggplot grace au package ‘patchwork’ ou avec le package ‘grid’.

Ces fonctionnalités nécessitent l’utilisation d’une sortie graphique utilisant ‘systemfonts’ : svglite::svglite(), ragg::agg_png() ou ggiraph::dsvg(). Ces packages doivent être utilisés pour garantir que toutes les polices que vous utilisez seront reconnues par le moteur graphique R.

Le graphique ci-dessus est produit par la fonction gen_grob().
Le code associé est disponible dans l’article Utiliser les masques de grid et flextable de la ‘galerie flextable’.

Exporter un flextable en png

Les versions antérieures de “flextable” utilisaient les paquets “webshot” ou “webshot2” pour obtenir une image à partir du résultat HTML. Ce mécanisme a été remplacé par l’utilisation de la sortie ‘Grid graphics’ et du paquet ‘ragg’. Cela permet d’avoir un processus d’écriture plus rapide et facilite la maintenance.

Dans un premier temps, on définit quelques paramètres généraux.

library(flextable)
library(gdtools)
set_flextable_defaults(
  font.family = "Open Sans", font.color = "#333333",
  theme_fun = theme_vanilla,
  digits = 2, big.mark = "", na_str = "")
register_gfont("Open Sans") # register Open Sans

Pour enregistrer un tableau au format png, il faut appeler la fonction save_as_image(). Illustrons notre propos avec un tableau fabriqué à partir du jeu de données ‘palmerpenguins::penguins’.

library(palmerpenguins)
filename <- "head-penguins.png"
ft <- as_flextable(palmerpenguins::penguins) |> bg(bg = "#EFEFEF", part = "all")
save_as_image(ft, path = filename)

La fonction gen_grob

Illustrons notre propos avec notre ‘flextable’ fabriqué à partir du jeu de données ‘penguins’ et un graphique ‘ggplot’.

library(tidyverse)
g1 <- ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm, color = species)) +
  geom_point() +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(plot.margin = unit(c(0, 0, 30, 0), "pt"))

Utilisation simple

La fonction gen_grob() va offrir par défaut un comportement d’adaptation à l’espace disponible pour le tableau.

library(patchwork)
g1 / gen_grob(ft, just = "bottom")

Cela fonctionne avec toutes les fonctions qui supportent les ‘grid Graphics’ :

g1 + 
  inset_element(gen_grob(ft |> bg(bg = "#EFEFEFAA", part = "all"), just = "bottom"), 0.1, 0.25, .9, .75) + 
  theme(
    plot.background = element_rect(fill = "transparent"),
    panel.background = element_rect(fill = "transparent")
  )

Les options de redimensionnements

Il est bien sûr possible de reprendre le contrôle sur ce redimensionnement automatique.

Nous allons utiliser pour cela un petit tableau qui aidera à présenter les options.

set_flextable_defaults(font.family = "Fira Sans Condensed")
register_gfont("Fira Sans Condensed")

dummy_ft <- data.frame(zzzz = ";)") |>
  flextable() |>
  color(color = "white", part = "all") |>
  mk_par(
    value = as_paragraph(
      as_chunk("made", props = fp_text_default(font.size = 30, color = "#f2af00")),
      as_chunk(" with\n", props = fp_text_default(color = "gray", font.size = 15)),
      as_chunk("flextable", props = fp_text_default(color = "#c32900", font.size = 45))
    ),
    part = "header") |>
  autofit() |>
  align(align = "center", part = "all") |>
  border_outer(border = fp_border_default(width = 0))

Le tableau dans sa version HTML est le suivant :

dummy_ft

made with
flextable

;)

Le graphique ci dessous présente quelques options de redimensionnements possibles :

  • Le premier tableau sera dimensionné pour s’adapter à la largeur disponible (fit = "width") et les polices seront redimensionnées au maximum possible (scaling = "full").
  • Le deuxième tableau est affiché sans aucun redimensionnement (fit = "fixed").
  • Le dernier tableau est affiché en utilisant la taille maximum possible (fit = "auto").
design <- "AAA
           BBC"
wrap_plots(
  dummy_ft |> 
    bg(bg = "#ff006e", part = "all") |> 
    gen_grob(fit = "width", scaling = "full", just = "bottom"),
  dummy_ft |> 
    bg(bg = "#3a86ff", part = "all") |> 
    gen_grob(fit = "fixed"),
  dummy_ft |> bg(bg = "#ffbe0b", part = "all") |> gen_grob(),
  design = design
)

Déroulement du contenu dans les cellules

Un algorithme est utilisé pour permettre au contenu d’être déroulé dans l’espace disponible de la cellule. Il est activé par défaut.

library(safetyData)

adsl <- adam_adsl[, c("AGE", "SEX", "ARM")]

dat <- summarizor(adsl, by = "ARM")
ft <- as_flextable(dat, spread_first_col = TRUE)
ft |> bg(bg = "#EFEFEF", part = "all") |> 
  plot(fit = "width", wrapping = TRUE, scaling = FALSE)

On peut désactiver ce comportement avec l’argument wrapping = FALSE.

ft |> bg(bg = "#EFEFEF", part = "all") |> 
  plot(fit = "width", wrapping = FALSE, scaling = FALSE)


Suivez nous:  -  Sites recommandés: R-bloggers R weekly Twitter #rstats Jobs for R-users