使用R Markdown制作并列的rgl图形

6

我正在尝试在R Markdown文档中使用rgl包绘制两个3D散点图并排显示。例如:

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

你的第一行有拼写错误 - 应该是:mfrow3d(nr = 1, nc = 2, sharedMouse = TRUE)。 - user666993
当我尝试在一行中绘制几个图表时,我遇到了类似的问题,只有最后一个图表在HTML上可见(虽然不是并排显示)。 - RgrNormand
2个回答

10
这是将边框装饰转换为Javascript代码时出现的错误。第一个图的范围传递到了第二个图中。由于它们是从不相关的数量计算出来的,所以会产生奇怪的框。该错误已在版本0.96.1516中修复,目前仅在R-forge上可用。
顺便说一下,使用当前的rgl,您不需要hook_webgl或library(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 中生成下面的图片:

输入图像描述


1
感谢您查看并修复了这个问题,但似乎还有其他因素在起作用,因为在安装了 rgl 0.96.1516 后,我只得到了一个图(右边的那个)。 - Mike Wise
以上发布了更多信息,并添加了 sessionInfo() - Mike Wise
第一个 plot3d 语句中最后一个逗号是什么意思(在 type = "s" 后面)? - Gürol Canbek

2

这里似乎有至少一个,甚至两个错误。稍微修改一下你的代码,如下所示:

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

在设备窗口中,该代码会产生以下效果:

enter image description here

但在R-Studio预览窗口中,会产生以下效果:

enter image description here

在Chrome浏览器加载的html文件中,会产生以下效果:

enter image description here

因此,只有第一个有效,而Markdown似乎破坏了它。

我建议您在这些问题得到解决之前,尽可能避免在Markdown中组合多个rgl图。这可能很困难,因为似乎存在各种图形设备和库之间的奇怪交互。

更新

根据D(?)的答案,问题已经得到解决,但似乎还存在另一个问题。提供此信息。

enter image description here


1
似乎是bbox代码中的一个错误。如果你使用axes=FALSE绘制这些图,并使用box3d()和axis3d()手动添加坐标轴,它们基本上是可以的。 - user2554330
奇怪。我用的是Mac,但大多数软件包版本看起来都一样。你能把.html文件放在某个地方让我查看吗? - user2554330
我无法重现这个问题。还有其他人遇到了吗? - user2554330
2
看了一下,HTML现在实际上可以正常工作并显示所有内容,只有R-Studio预览无法显示多个rgl图。 - Mike Wise
还有一个大型的Javascript库可以完成所有渲染工作。当我在RStudio中查看某个内容时,它会显示为<script src="lib/rglwidgetClass-2/rglClass.src.js"></script>。我不确定如何在该环境中查看其中的内容。 - user2554330
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接