如何让 rgl 中的“smooth=FALSE”参数在 RMarkdown 中工作?

问题描述 投票:0回答:1

当我通过在 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

RGL window

但是,当尝试在 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()
    ```

RMarkdown output

这是 rgl 中的错误吗?如何在 R Markdown 中显示此交互式方格表面?

r r-markdown knitr rgl
1个回答
0
投票

这是一个错误,或者至少是 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 网站上。

© www.soinside.com 2019 - 2024. All rights reserved.