RMarkdown: Comment intégrer un tracé 3D?

Aug 26 2020

Comment intégrer un tracé 3D (rgl) dans un html créé via knitr?

Il y a plusieurs articles plus anciens qui recherchent un résultat similaire. Cependant, lorsque j'exécute tous les exemples de codes que j'ai trouvés. Le rgl-plot n'est pas intégré dans le html créé avec knitr, mais apparaît dans une fenêtre externe pendant le "tricotage" et disparaît lorsque la page html apparaît.

Ce que je recherche, c'est un moyen d'intégrer le tracé 3D dans le html résultant. Cela ne me dérange pas de savoir si cela reste interactif ou devient statique.

L'exemple suivant est tiré du livre de recettes R Markdown: https://bookdown.org/yihui/rmarkdown-cookbook/rgl-3d.html


title: Embed 3D plots with rgl
output: html_document
---

Set up a hook to save **rgl** plots:

```{r, setup}
library(rgl)
knitr::knit_hooks$set(webgl = hook_webgl)
```

See if it works for this 3D plot after we enable the hook
via the chunk option `webgl = TRUE`:

```{r, test-rgl, webgl=TRUE}
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col = rainbow(1000))
```

Réponses

2 user2554330 Aug 26 2020 at 18:52

Ce que vous avez fait devrait fonctionner, mais ce n'est pas la meilleure façon d'incorporer des rglgraphiques dans un document.

Le moyen le plus simple consiste à effectuer un appel à l' rglwidget()endroit où vous souhaitez insérer le tracé actuel. Vous pouvez également utiliser options(rgl.useNULL=TRUE)pour supprimer la fenêtre distincte qui rglcrée lors du tracé. Par example,

---
title: Embed 3D plots with rgl
output: html_document
---

No need for a hook with `rgl` version >= 0.96.0, just call `rglwidget()`.

```{r, setup}
options(rgl.useNULL = TRUE) # Suppress the separate window.
library(rgl)
```

See it work for this 3D plot without the hook:

```{r}
x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000) + atan2(x,y)
plot3d(x, y, z, col = rainbow(1000))
rglwidget()
```

La version non publiée 0.102.21 de rglrend les choses encore plus simples: les rgltracés peuvent apparaître sous presque les mêmes règles que les tracés graphiques de base, avec juste un appel à rgl::setupKnitr(autoprint = TRUE)au début.

J'ai dit que ce que vous avez essayé devrait fonctionner, et cela fonctionne pour moi. Pourquoi pas pour toi? Il est difficile de deviner ce qui ne va pas, mais la chose la plus probable est probablement que votre navigateur Web n'a pas activé WebGL, ou que vous utilisez une ancienne version de R ou rglqui contient un bogue. Une solution simple pour un mauvais navigateur consiste à passer à un tracé statique; vous pouvez le faire avec votre code en changeant hook = hook_webglen hook = hook_rgl.