【问题标题】:RMarkdown: How to embed an 3D plot?RMarkdown:如何嵌入 3D 绘图?
【发布时间】:2020-08-26 10:36:21
【问题描述】:

如何将 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))
```

【问题讨论】:

    标签: r-markdown knitr rgl


    【解决方案1】:

    您所做的应该可行,但这不是在文档中嵌入 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 使其更加简单:rgl 绘图可以按照与基本图形绘图几乎相同的规则显示,只需在开始时调用 rgl::setupKnitr(autoprint = TRUE)。

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

    【讨论】:

    • rglwidget() 工作正常。伟大的!仍然无法弄清楚为什么其他方式对我不起作用。浏览器设置好像没问题。 rgl 的问题对我来说很熟悉,我使用的版本可能是一个原因。无论如何感谢您的回答
    • 是否可以增加输出文件中的窗口大小?我有一个 3D rgl 图,其轴标签很小(bcz 标签的数量很大)。必须放大 3D 图才能清楚地显示标签。但是,在放大图形以使标签可见之前,标签已经离开了窗口框。我也没有找到翻译 3D 图的方法,以便我可以将感兴趣的标签居中以进行放大。有什么解决方案吗?
    • @Patrick:当前版本的rglwidget() 尊重knitr 中的fig.width 和fig.height 设置;这是改变大小的最佳方式。 rglwidget() 也有 width 和 height 参数,但它们可能会与 knitr 设置产生不良交互。
    猜你喜欢
    • 2017-01-14
    • 2020-08-02
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2020-04-17
    相关资源
    最近更新 更多