使用 R Markdown 并排绘制 rgl 图

Side-by-side rgl plots with R Markdown

我正在尝试获取两个 3D 散点图,它们是用 rgl 包绘制的,并排在 R Markdown 文档中。例如:

mfrow3d(nr = 1, nc = 2, sharedMouse = TRUE)  
plot3d(mtcars[, 1:3], type = "s")  
plot3d(mtcars[, 4:6], type = "s")
rglwidget()

当直接在控制台中 运行 但当使用 R Markdown 编织到 HTML 文档时,这非常有效,似乎只渲染了第二个图。

我尝试添加 knit_hooks$set(webgl = hook_webgl) 并设置块选项 webgl = TRUE,但这也没有帮助。

如有任何建议,我们将不胜感激。

这是我 sessionInfo() 的输出:

R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] rgl_0.96.0           tidyr_0.6.0          dplyr_0.5.0          smacof_1.8-13       
 [5] emojifont_0.3.3      gridExtra_2.2.1      knitr_1.14           MASS_7.3-45         
 [9] shinydashboard_0.5.1 shiny_0.13.2         RColorBrewer_1.1-2   ggplot2_2.1.0       

loaded via a namespace (and not attached):
 [1] gtools_3.5.0        splines_3.3.1       lattice_0.20-33     colorspace_1.2-6   
 [5] htmltools_0.3.5     yaml_2.1.13         base64enc_0.1-3     chron_2.3-47       
 [9] survival_2.39-4     DBI_0.5             foreign_0.8-66      plyr_1.8.4         
[13] stringr_1.1.0       munsell_0.4.3       gtable_0.2.0        htmlwidgets_0.7    
[17] evaluate_0.9        latticeExtra_0.6-28 httpuv_1.3.3        proto_0.3-10       
[21] Rcpp_0.12.6         acepack_1.3-3.3     xtable_1.8-2        polynom_1.3-8      
[25] scales_0.4.0        formatR_1.4         showtext_0.4-4      gdata_2.17.0       
[29] jsonlite_1.0        Hmisc_3.17-4        sysfonts_0.5        mime_0.5           
[33] weights_0.85        digest_0.6.10       stringi_1.1.1       showtextdb_1.0     
[37] grid_3.3.1          tools_3.3.1         magrittr_1.5        tibble_1.2         
[41] Formula_1.2-1       mice_2.25           cluster_2.0.4       Matrix_1.2-6       
[45] rsconnect_0.4.3     data.table_1.9.6    nnls_1.4            assertthat_0.1     
[49] rmarkdown_1.0.9013  R6_2.1.3            rpart_4.1-10        nnet_7.3-12

这里似乎至少有一个,更像是两个错误。稍微修改你的代码,这个:

```{r echo=T}
library(rgl)
library(rglwidget)
library(knitr)
knit_hooks$set(webgl = hook_webgl)

mfrow3d(nr = 2, nc = 2, sharedMouse = T)  
plot3d(mtcars[, 1:3], type = "s",)  
plot3d(mtcars[, 4:6], type = "s")
plot3d(mtcars[, 1:3], type = "s")  
plot3d(mtcars[, 4:6], type = "s")
rglwidget()
```

在一个短暂可见的设备中生成这个 window:

但这在 R-Studio 预览中 window:

并且 html 文件中的这个加载到 Chrome 浏览器中:

所以只有第一个有效,markdown 似乎破坏了它。

我想说你应该避免在 markdown 中组合多个 rgl 图,直到这个(这些)错误得到修复。可能很难,因为它似乎是各种图形设备和库之间的一些奇怪的交互。

更新

看起来 D (?) 根据他的回答解决了问题,但似乎还有另一个问题在起作用。将此作为信息发布。

这是将边界框装饰转换为 Javascript 代码时的错误。第一个地块的边界延续到第二个地块。由于它们是根据不相关的数量计算得出的,因此您会得到奇怪的盒子。该错误现已在 0.96.1516 版本中修复,目前仅在 R-forge 上。

顺便说一下,当前 rgl 您不需要 hook_webgllibrary(rglwidgets)。如果要插入绘图,只需使用 library(rgl) 并调用 rglwidget()。 (有一种方法可以在不调用 rglwidget() 的情况下自动插入绘图,但我不推荐它。)

因此您的文档可能如下所示:

```{r echo=TRUE}
library(rgl)
mfrow3d(nr = 1, nc = 2, sharedMouse = TRUE)  
plot3d(mtcars[, 1:3], type = "s",)  
plot3d(mtcars[, 4:6], type = "s")
rglwidget()
```

这会在 rgl 0.96.1516 中生成下图: