2017-04-06 68 views
1

我想用兩個3d散點圖使用rgl使用knitr生成一個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參數(意思是「字符擴展」)在某種程度上在呼叫調用中有不同的解釋。看起來像一個小錯誤。

但是我也發現你可以通過在每個plot之前加上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

我建議您不要使用webgl=TRUE,把一個rglwidget()呼叫在底部。這使得文本太大,因爲它從256x256的小窗口放大;使用r3dDefaults$windowRect <- c(0,0,1000,1000)(或類似的大值)來獲得更好的尺寸。

您可能還想在開始時使用options(rgl.useNULL = TRUE),因此編織時不會彈出窗口。這有一個副作用,允許您將r3dDefaults$windowRect值設置爲比物理屏幕更大的值。

r3dDefaults$windowRectoptions("rgl.useNULL")值應該只需要在文檔頂部附近設置一次,除非您明確更改它們,否則將應用於以下所有圖。

相關問題