当我通过在 R 中的 rgl 包中设置 smooth=FALSE 来制作方格表面时,它会正确显示在我的计算机的 rgl 窗口中,但不会在 knitted R Markdown 文档中或 RStudio 查看器中显示,它显示为默认的 smooth=TRUE .
这按预期显示在 XQuartz 窗口中:
library(rgl)
# Create x, y, and z points
set.seed(123)
x <- sort(rnorm(10))
y <- sort(rnorm(10))
f <- function(x,y) {r <- x+y}
z <- outer(x,y,f)
# Create a grid on the x and y axes
x.grid <- seq(min(x), max(x), length.out =10)
y.grid <- seq(min(y), max(y), length.out =10)
# Create a checkered surface
persp3d(x = x.grid,
y = y.grid,
z = z,
xlab="x", ylab="y", zlab="z",
col=rainbow(9),
lit = FALSE,
smooth = FALSE) # This works
但是,当尝试在 RMarkdown 文件中重新创建此文件时,棋盘格变得模糊。看来
smooth=FALSE
无法识别:
```{r echo=F}
library(rgl)
# Create x, y, and z points
set.seed(123)
x <- sort(rnorm(10))
y <- sort(rnorm(10))
f <- function(x,y) {r <- x+y}
z <- outer(x,y,f)
# Create a grid on the x and y axes
x.grid <- seq(min(x), max(x), length.out =10)
y.grid <- seq(min(y), max(y), length.out =10)
# Create a checkered surface
persp3d(x = x.grid,
y = y.grid,
z = z,
xlab="x", ylab="y", zlab="z",
col=rainbow(9),
lit = F,
smooth = F) # Now this does not work
rglwidget()
```
这是 rgl 中的错误吗?如何在 R Markdown 中显示此交互式方格表面?
这是一个错误,或者至少是 WebGL 显示的限制。 当您在内置显示中选择
smooth = FALSE
时,将使用旧的 OpenGL 1.2 语义。 它们允许将三角形或四边形一个顶点的颜色用于整个多边形。
但是,在 Rmarkdown 文档中,您使用的是 WebGL,它基于不支持该模式的更现代的 OpenGL 版本。 要以全一种颜色显示三角形或四边形,您需要将三角形的所有顶点设置为该颜色。
您可以通过单独绘制面来自己伪造这一点。
有一种方法可以半自动地完成此操作,方法是绘制表面,将其转换为网格,然后摆弄网格以更改颜色的应用方式。 您希望网格最终以
meshColor = "faces"
结束,但您还需要更改颜色矢量以为每个面提供一种颜色。
这是执行此操作的代码版本:
library(rgl)
# Create x, y, and z points
set.seed(123)
x <- sort(rnorm(10))
y <- sort(rnorm(10))
f <- function(x,y) {r <- x+y}
z <- outer(x,y,f)
# Create a grid on the x and y axes
x.grid <- seq(min(x), max(x), length.out =10)
y.grid <- seq(min(y), max(y), length.out =10)
# Create a checkered surface
open3d()
ids <- persp3d(x = x.grid,
y = y.grid,
z = z,
xlab="x", ylab="y", zlab="z",
col=rainbow(9),
lit = FALSE,
smooth = FALSE)
m <- as.mesh3d(rglId(ids["surface"]))
m$meshColor <- "faces"
oldcolor <- m$material$color
indices <- setdiff(1:90, (0:8)*10 + 1)
m$material$color <- oldcolor[indices]
open3d()
plot3d(m)
可以使其完全自动化。 如果您想这样做,您应该将其作为 PR 提交到
rgl
Github 网站上。