[英]unexpected behaviour plotting legends with plot3d and knitr
我正在尝试使用knitr
使用 rgl 生成一个带有两个 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)}
```
任何帮助都感激不尽!
这是一个有点怪异,我看了一下,注意到cex
参数(这确实意味着“字符扩大”)在legend3d
呼叫不知何故被解释不同的呼叫打电话。 似乎是一个小错误。
但是我也发现你可以通过在每个绘图之前添加一个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)}
```
截屏:
我建议你不要使用webgl=TRUE
,在底部放置一个rglwidget()
调用。 这使得文本太大,因为它是从 256x256 rgl 小窗口放大的; 使用r3dDefaults$windowRect <- c(0,0,1000,1000)
(或类似的大值)以获得更好的尺寸。
您可能还想在开始时使用options(rgl.useNULL = TRUE)
,这样您就不会在编织时弹出窗口。 这有一个副作用,即允许您将r3dDefaults$windowRect
值设置为大于物理屏幕的值。
r3dDefaults$windowRect
和options("rgl.useNULL")
值应该只需要在文档顶部附近设置一次,除非您明确更改它们,否则将应用于所有以下绘图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.