Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Side-by-side rgl plots with R Markdown

I am trying to get two 3D scatter plots, drawn with the rgl package, side-by-side in an R Markdown document. For example:

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

This works perfectly when run directly in the console but when knit to an HTML document using R Markdown, it seems as if only the second plot is rendered.

I tried adding knit_hooks$set(webgl = hook_webgl) and setting the chunk option webgl = TRUE, but that did not help either.

Any suggestions would be appreciated.

This is my output from 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
like image 747
Jandre Marais Avatar asked Sep 01 '16 21:09

Jandre Marais


2 Answers

This was a bug in the conversion of the bounding box decoration to Javascript code. The bounds from the first plot carried over to the second one. Since they were calculated from unrelated quantities, you got weird boxes resulting. The bug is now fixed in version 0.96.1516, currently only on R-forge.

By the way, with current rgl you don't need hook_webgl or library(rglwidgets). Just use library(rgl) and call rglwidget() if you want to insert a plot. (There's a way to automatically insert plots without the rglwidget() call, but I don't recommend it.)

So your document could look like this:

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

This produces the picture below in rgl 0.96.1516:

enter image description here

like image 140
user2554330 Avatar answered Oct 10 '22 04:10

user2554330


There seems to be at least one, and more like two bugs in play here. Modifying your code a bit, this:

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

produces this in a briefly visible device window:

enter image description here

but this in the R-Studio preview window:

enter image description here

And this in the html file loaded into the Chrome browser:

enter image description here

So only the first one works, and markdown seems to break it.

I would say you should probably just avoid composing multiple rgl plots in markdown until this (these) bugs get fixed. Might be hard as it seems to be some weird interaction between the various graphics devices and the library.

Update

Looks like D (?) fixed the issue per his answer, but there seems to be another issue in play too. Posting this as information.

enter image description here

like image 35
Mike Wise Avatar answered Oct 10 '22 03:10

Mike Wise