在 R 中按变量着色表面

Color surface by variable with plotly in R

使用 volcano 数据,我想用另一个变量为火山表面着色,该变量是一个矩阵 MatrixForColor,大小与 volcano 相同,并且它只包含 1s 和 2s(二进制)。对于 MatrixForColor = 1MatrixForColor = 2,我想分别涂上蓝色和红色。

受到 Formatting of persp3d plot 的启发,我使用 rgl 包中的 persp3d 实现了这一点,如下所示:

library(rgl)    
color = c("blue", "red")
type  = MatrixForColor
persp3d(volcano, theta=50, phi=25, expand=0.75, col=color[type],
        ticktype="detailed", xlab="", ylab="", zlab="", axes=TRUE)

得到这个数字:

我也尝试通过 plotly 实现此目的(根据 的响应进行调整),如下所示:

library(plotly)
plot_ly(colors = c('blue', 'red')) %>%
  add_surface(z = volcano,
              opacity = 0.8,
              surfacecolor=MatrixForColor,
              cauto=F,
              cmax=1,
              cmin=0
  )

但我得到这个数字:

这不是我想要的,因为它在 MatrixForColor 之后没有变成红色和蓝色。

有人知道如何用 plotly 做到这一点吗?

您需要为 cmincmax 设置正确的值:

library(plotly)

MatrixForColor <- matrix(1, nrow = nrow(volcano), ncol = ncol(volcano))
MatrixForColor[, 1:30] <- 2

plot_ly(colors = c('blue', 'red')) %>%
  add_surface(z = volcano,
              opacity = 0.8,
              surfacecolor = MatrixForColor,
              cauto=F,
              cmax=max(MatrixForColor),
              cmin=min(MatrixForColor)
  )