使用plot3d和knitr打印图例时出现意外行为

使用plot3d和knitr打印图例时出现意外行为,r,r-markdown,knitr,legend,rgl,R,R Markdown,Knitr,Legend,Rgl,我正在尝试使用rgl使用knitr生成一个包含两个3d散点图的html文档,但在尝试向两个图添加图例时遇到了问题。使用完全相同的代码(从一个块复制并粘贴到另一个块,然后更改要打印的值),第一个打印的图例以html方式显示太大。我已经生成了一个示例脚本,其数据与我正在使用的类似: --- title: "example" output: html_document --- Example script # First plot ```{r 1st chunk, webgl=TRUE, echo

我正在尝试使用rgl使用
knitr
生成一个包含两个3d散点图的html文档,但在尝试向两个图添加图例时遇到了问题。使用完全相同的代码(从一个块复制并粘贴到另一个块,然后更改要打印的值),第一个打印的图例以html方式显示太大。我已经生成了一个示例脚本,其数据与我正在使用的类似:

---
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)}
```
---
标题:“示例”
输出:html\u文档
---
示例脚本
#第一个情节
```{r第一块,webgl=TRUE,echo=FALSE,fig.width=10,fig.height=10}
图书馆(rgl)
knitr::knit_hooks$set(webgl=hook_webgl)

dt这有点奇怪,我看了一下,注意到
legend3d
调用中的
cex
参数(它的意思是“字符扩展”)在call-to-call中的解释有所不同。好像是个小虫子

不过,我还发现可以通过在每个绘图之前添加一个
open3d
命令来修复它。也许这是个解决办法

代码:

---
标题:“示例”
输出:html\u文档
---
示例脚本
```{r第0个块,webgl=TRUE,echo=FALSE}
图书馆(rgl)
knitr::knit_hooks$set(webgl=hook_webgl)
```
#第一个情节
```{r第一块,webgl=TRUE,echo=FALSE,fig.width=5,fig.height=5}

glob_cex我建议您不要使用
webgl=TRUE
,在底部放置一个
rglwidget()
调用。这使得文本太大,因为它是从小的256x256 rgl窗口放大的;使用
r3dDefaults$windowRect是否有任何反馈?是的,对不起,@MikeWise。当我用我的数据尝试你的建议时,结果是两个传说都变得太大了。所以我试图找出发生了什么,或者至少创建一个例子,用更接近我真实数据的数据重现它。我很快就会把它作为答案发布!所以你得到的结果和我发布的结果不同?
---
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)}
```