在 R 中按变量着色表面
Color surface by variable with plotly in R
使用 volcano
数据,我想用另一个变量为火山表面着色,该变量是一个矩阵 MatrixForColor
,大小与 volcano
相同,并且它只包含 1s 和 2s(二进制)。对于 MatrixForColor = 1
和 MatrixForColor = 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
做到这一点吗?
您需要为 cmin
和 cmax
设置正确的值:
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)
)
使用 volcano
数据,我想用另一个变量为火山表面着色,该变量是一个矩阵 MatrixForColor
,大小与 volcano
相同,并且它只包含 1s 和 2s(二进制)。对于 MatrixForColor = 1
和 MatrixForColor = 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
做到这一点吗?
您需要为 cmin
和 cmax
设置正确的值:
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)
)