Créer une image à partir d’un flextable

David Gohel

2019/05/23

flextable 0.5.4 est maintenant sur le CRAN. Cette version contient une nouvelle option de sortie qui répond à la demande de quelques utilisateurs : la capacité à sauver les flextables en tant qu’images grâce à la fonction save_as_image.

La solution existait déjà mais elle était un peu perdue dans une question de stackoverflow au lieu d’être implémentée proprement dans flextable.

Cette fonctionnalité a ouvert d’autres possibilités ; vous pouvez maintenant utiliser la méthode plot, ainsi que as_raster, et faire du raster ce que vous voulez (par exemple le combiner avec un objet ggplot).

Demo

D’abord, on créer un flextable simple.

library(flextable)
ft <- flextable( head( mtcars ) )
ft <- autofit(ft)
ft

mpg

cyl

disp

hp

drat

wt

qsec

vs

am

gear

carb

21.000

6.000

160.000

110.000

3.900

2.620

16.460

0.000

1.000

4.000

4.000

21.000

6.000

160.000

110.000

3.900

2.875

17.020

0.000

1.000

4.000

4.000

22.800

4.000

108.000

93.000

3.850

2.320

18.610

1.000

1.000

4.000

1.000

21.400

6.000

258.000

110.000

3.080

3.215

19.440

1.000

0.000

3.000

1.000

18.700

8.000

360.000

175.000

3.150

3.440

17.020

0.000

0.000

3.000

2.000

18.100

6.000

225.000

105.000

2.760

3.460

20.220

1.000

0.000

3.000

1.000

Si on souhaite le sauver en png, on peut utiliser le code suivant :

save_as_image(ft, path = "name.png")

On peut aussi utiliser la fonction plot :

plot(ft)

Ou encore le combiner avec un graphique ggplot :

library(ggplot2)
library(grid)
library(cowplot)

anyplot <- qplot(speed, dist, data = cars, geom = "point")

ft_raster <- as_raster(ft)

gflextable <- ggplot() + 
  theme_void() + 
  annotation_custom(rasterGrob(ft_raster), xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf)

plot_grid(anyplot, gflextable, nrow = 2, ncol = 1, rel_heights = c(4, 1) )

Note à propos de la largeur et hauteur

Il peut être intéressant de connaître les dimensions exactes d’un flextable. Pour cela, on utilise la fonction flextable_dim() qui va renvoyer les dimensions et le ratio d’aspect.

dims <- flextable_dim(ft)
dims
#> $widths
#> [1] 7.948045
#> 
#> $heights
#> [1] 2.035298
#> 
#> $aspect_ratio
#> [1] 0.2560753

Il faudra par exemple utiliser ces informations pour renseigner les options knitr du chunk qui produit le graphique avec plot : fig.asp, fig.width et fig.height.