2017-04-06 1 views
1

rglを使用して2つの3d scatterプロットを含むhtmlドキュメントを生成しようとしていますが、両方のプロットに凡例を追加しようとすると問題が発生します。ちょうど同じコードを使用して(あるチャンクから別のチャンクにコピーして貼り付けた後、値をプロットに変更すると)、最初のプロットの凡例はhtml形式で非常に大きく表示されます。私は使用しているものと似たデータを持つサンプルスクリプトを生成しました:予期しない動作plot3dとknitrで凡例をプロットする

--- 
title: "example" 
output: html_document 
--- 

Example script 

# First plot 
```{r 1st chunk, webgl=TRUE, echo = FALSE, fig.width=10, fig.height=10} 
library(rgl) 
knitr::knit_hooks$set(webgl = hook_webgl) 
dt <- data.frame(x = runif(70, min = 1, max = 10), 
       y = runif(70, min = -10, max = 1), 
       z = runif(70, min = -20, max = -10), 
       groups = rep(c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7"), each = 10)) 
plot3d(dt$x, dt$y, dt$z, 
     xlab = "X", ylab = "Y", zlab = "Z", 
     type ="n") 
grid3d(c("x", "y+", "z")) 
legend3d("bottomright", 
     c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7"), 
     col = c(1:7), 
     pch = 20, 
     bg = "black", 
     bty = "n", 
     y.intersp = 0.8, 
     cex = 1.5) 
for (i in seq_along(unique(dt$groups))){ 
    sub <- dt[dt$groups == unique(dt$groups)[i],] 
    pch3d(sub$x, sub$y, sub$z, 
     col = i, 
     pch = 16, 
     radius = 0.2, 
     add = T)} 
``` 

This first legend is way too large, while, with the exame same code, for the next plot, the legend is normal size 

# Second plot 
```{r 2nd chunk, webgl=TRUE, echo = FALSE, fig.width=10, fig.height=10} 
library(rgl) 
knitr::knit_hooks$set(webgl = hook_webgl) 
dt <- data.frame(x = runif(150, min = 2, max = 20), 
       y = runif(150, min = -20, max = 2), 
       z = runif(150, min = -30, max = -20), 
       groups = rep(c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8", 
           "Group9", "Group10", "Group11", "Group12", "Group13", "Group14", "Group15"), each = 10)) 
plot3d(dt$x, dt$y, dt$z, 
     xlab = "X", ylab = "Y", zlab = "Z", 
     type ="n") 
grid3d(c("x", "y+", "z")) 
legend3d("bottomright", 
     c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8", 
     "Group9", "Group10", "Group11", "Group12", "Group13", "Group14", "Group15"), 
     col = c(1:15), 
     pch = 20, 
     bg = "black", 
     bty = "n", 
     y.intersp = 0.8, 
     cex = 1.5) 
for (i in seq_along(unique(dt$groups))){ 
    sub <- dt[dt$groups == unique(dt$groups)[i],] 
    pch3d(sub$x, sub$y, sub$z, 
     col = i, 
     pch = 16, 
     radius = 0.2, 
     add = T)} 
``` 

何か助けていただければ幸いです!

+0

私にはどんなフィードバックがありますか? –

+0

はい、申し訳ありませんが、@MikeWise。私のデータであなたの提案を試みたときに起こったことは、両方の伝説が大きすぎるということです。だから私は何が起こったのか、少なくとも私の実際のデータに似たデータでそれを再現した例を作成しようとしていました。私はすぐに回答として投稿します! –

+0

投稿した結果とは異なる結果が得られましたか? –

答えて

1

私はそれを見て、legend3dコールのcexパラメータ(「文字拡張」を意味する)が何らかの形でコールコールで異なって解釈されていることに気付きました。マイナーなバグみたいです。

しかし、それぞれのプロットの前にopen3dコマンドを追加することで問題を解決できることもわかりました。多分それは修正ですか?

コード:

--- 
title: "example" 
output: html_document 
--- 

Example script 

```{r 0th chunk, webgl=TRUE, echo = FALSE} 
library(rgl) 
knitr::knit_hooks$set(webgl = hook_webgl) 
``` 

# First plot 


```{r 1st chunk, webgl=TRUE, echo = FALSE, fig.width=5, fig.height=5} 
glob_cex <- 0.6 

open3d() 
dt <- data.frame(x = runif(70, min = 1, max = 10), 
       y = runif(70, min = -10, max = 1), 
       z = runif(70, min = -20, max = -10), 
       groups = rep(c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7"), each = 10)) 
plot3d(dt$x, dt$y, dt$z, 
     xlab = "X", ylab = "Y", zlab = "Z", 
     type ="n") 
grid3d(c("x", "y+", "z")) 
legend3d("bottomright", 
     c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7"), 
     col = c(1:7), 
     pch = 20, 
     bg = "black", 
     bty = "n", 
     y.intersp = 0.8, 
     cex = 0.8) 
for (i in seq_along(unique(dt$groups))){ 
    sub <- dt[dt$groups == unique(dt$groups)[i],] 
    pch3d(sub$x, sub$y, sub$z, 
     col = i, 
     pch = 16, 
     radius = 0.2, 
     add = T)} 
``` 

Legends are now the same size by adding an open3d() command before each plot. 

# Second plot 
```{r 2nd chunk, webgl=TRUE, echo = FALSE, fig.width=5, fig.height=5} 
open3d() 
dt <- data.frame(x = runif(150, min = 2, max = 20), 
       y = runif(150, min = -20, max = 2), 
       z = runif(150, min = -30, max = -20), 
       groups = rep(c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8", 
           "Group9", "Group10", "Group11", "Group12", "Group13", "Group14", "Group15"), each = 10)) 
plot3d(dt$x, dt$y, dt$z, 
     xlab = "X", ylab = "Y", zlab = "Z", 
     type ="n") 
grid3d(c("x", "y+", "z")) 
legend3d("bottomright", 
     c("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8", 
     "Group9", "Group10", "Group11", "Group12", "Group13", "Group14", "Group15"), 
     col = c(1:15), 
     pch = 20, 
     bg = "black", 
     bty = "n", 
     y.intersp = 0.8, 
     cex = 0.8) 
for (i in seq_along(unique(dt$groups))){ 
    sub <- dt[dt$groups == unique(dt$groups)[i],] 
    pch3d(sub$x, sub$y, sub$z, 
     col = i, 
     pch = 16, 
     radius = 0.2, 
     add = T)} 
``` 

スクリーンショット:

enter image description here

0

私は一番下にrglwidget()コールを入れて、あなたはwebgl=TRUEを使用しないことをお勧めしたいです。これは小さな256x256 rglウィンドウから拡大されているため、テキストを大きすぎます。より良いサイジングを得るためにr3dDefaults$windowRect <- c(0,0,1000,1000)(または同様の大きな値)を使用してください。

また、最初にoptions(rgl.useNULL = TRUE)を使用すると、編み出し中にウィンドウがポップアップすることはありません。これには、r3dDefaults$windowRectの値を物理的な画面よりも大きな値に設定できるという副作用があります。

r3dDefaults$windowRectoptions("rgl.useNULL")の値は、ドキュメントの一番上に一度設定する必要があります。明示的に変更しない限り、すべての次のプロットに適用されます。

関連する問題