问题描述
如何将3D图(rgl)嵌入到通过knitr创建的html中?
有一些较旧的帖子正在寻找类似的结果。但是,当我运行所有示例代码时,我发现了。 rgl-plot不会嵌入到用knitr创建的html中,而是在“编织”时显示在外部窗口中,并在出现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
绘制时创建的单独窗口。例如,
---
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()
```
rgl
的未发布版本0.102.21使其更加简单:只需调用{{1},就可以使rgl
图的显示与基本图形图的显示规则几乎相同。 }。
我说您尝试过的方法应该起作用,并且对我有用。为什么不适合你?很难猜测出了什么问题,但是最有可能的原因是您的网络浏览器未启用WebGL,或者您使用的是R或rgl::setupKnitr(autoprint = TRUE)
的某个旧版本,其中包含错误。不良浏览器的一种简单解决方法是切换到静态图。您可以通过将rgl
更改为hook = hook_webgl
来使用代码。