RMarkdown:如何嵌入 3D 图?

RMarkdown: How to embed an 3D plot?

如何将 3D 图 (rgl) 嵌入到通过 knitr 创建的 html 中?

有几篇较旧的帖子正在寻找类似的结果。但是,当我 运行 找到所有示例代码时。 rgl-plot 没有嵌入到用 knitr 创建的 html 中,而是在“编织”时出现在外部 window 中,并在 html 页面出现时消失。

我正在寻找的是一种将 3D 绘图集成到结果 html 中的方法。我不介意它是保持交互还是静态。

以下示例摘自 R Markdown Cookbook: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))
```

您所做的应该可行,但这不是在文档中嵌入 rgl 图形的最佳方式。

最简单的方法是调用 rglwidget() 您想要插入当前绘图的位置。您还可以使用 options(rgl.useNULL=TRUE) 来抑制 rgl 在绘图时创建的单独 window。例如,

---
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()
```

版本 0.102.21 或更高版本的 rgl 使它变得更加简单:rgl 绘图可以按照与基本图形绘图几乎相同的规则出现,只需调用 rgl::setupKnitr(autoprint = TRUE)开头。

我说你试过的应该有用,它对我有用。为什么不适合你?很难猜出哪里出了问题,但最有可能的可能是您的网络浏览器没有启用 WebGL,或者您使用的是一些旧版本的 R 或 rgl,其中有一个错误。一个糟糕的浏览器的简单解决方法是切换到静态图;您可以通过将 hook = hook_webgl 更改为 hook = hook_rgl.

来使用您的代码做到这一点