R 错误:根据矩阵中的值对图着色
Posted
技术标签:
【中文标题】R 错误:根据矩阵中的值对图着色【英文标题】:R Error: Coloring Graphs According to Values Within a Matrix 【发布时间】:2021-10-01 12:31:45 【问题描述】:我正在使用 R 编程语言。
我正在尝试在变量“x、y 和 w”之间制作一个 3 维图,并根据“z”的值对该图进行着色:
library(plotly)
library(dplyr)
X <- seq(0,3.1,0.1)
Y <- seq(0,3.1,0.1)
W <- seq(0,3.1,0.1)
DF <- expand.grid(X,Y, W)
#Compute variable for colors
DF$Z <- sin(DF$Var1) + cos(DF$Var2) + sin(DF$Var3)
#make a matrix of color values
Mat <- matrix(DF$Z,nrow = 32)
#make a matrix for z values
Mat2 <- matrix(rep(c(1:16,16:1),32),nrow=32)
#plot
plot_ly(y=~Y,x=X, z=~W) %>%
add_surface(surfacecolor=~Mat)
但这会产生错误:
Error: `z` must be a numeric matrix
谁能告诉我如何解决这个问题?
谢谢
注意:出于某种原因,以下代码有效:
X <- seq(0,3.1,0.1)
Y <- seq(0,3.1,0.1)
DF <- expand.grid(X,Y)
#Compute variable for colors
DF$Z <- sin(DF$Var1) + cos(DF$Var2)
#make a matrix of color values
Mat <- matrix(DF$Z,nrow = 32)
#make a matrix for z values
Mat2 <- matrix(rep(c(1:16,16:1),32),nrow=32)
plot_ly(y=~Y,x=X, z=~Mat2) %>%
add_surface(surfacecolor=~Mat)
【问题讨论】:
【参考方案1】:您的数据本质上是线上的点 三个维度(X
、Y
、W
),因此不清楚您要绘制什么表面。 add_surface
期望 z
-values 是一个 32x32 矩阵(因为 X
和 Y
各有 32 个条目)但是您在(第一次)调用中提供了向量 W
,因此会出现错误。在您的第二次尝试中,您提供 Mat2
这是一个具有适当尺寸的矩阵。另请注意,surfacecolor
也必须是 32x32 矩阵。
所以设置W
矩阵,计算颜色矩阵colors
(为了简单起见,我在下面使用了一个矩阵),
W <- matrix(rep(1, 32^2), ncol = 32)
grid <- data.frame(W = c(W), X = rep(X, each = 32), Y = Y)
colors <-
matrix(
mapply(function(x,y,z) sin(x)+cos(y)+sin(z), grid$X, grid$Y, grid$W),
nrow = 32, byrow = T
)
和情节:
plot_ly(y = ~Y, x = ~X, z = ~W) %>%
add_surface(surfacecolor = ~colors)
编辑
要绘制 X
、Y
和 Z
,请将 DF$Z
适当地转换为 32x32 矩阵:
DF <- expand.grid(X,Y)
DF$Z <- sin(DF$Var1) + cos(DF$Var2)
Z <- matrix(DF$Z, nrow = 32)
plot_ly(y = ~Y, x = ~X, z=~Z) %>%
add_surface()
【讨论】:
非常感谢您的回答!假设我只想制作一张 X、Y 和 Z 的图(忽略 W)——你能告诉我怎么做吗? 为什么选择“32”? 32 是您的X
和 Y
向量的长度。您可以使用length(X)
进行检查。我已经编辑了我的答案
非常感谢您的回答!我试图稍微修改你的答案 - 你能告诉我下面的代码是否有意义吗? (分号;表示新的代码行)
代码看起来不错。请注意,1:n
生成的网格对于add_surface
而言可能过于粗糙。提供更精细的网格会更好(例如,使用seq()
,就像您在上面所做的那样。以上是关于R 错误:根据矩阵中的值对图着色的主要内容,如果未能解决你的问题,请参考以下文章