【问题标题】:R Error: Coloring Graphs According to Values Within a MatrixR 错误:根据矩阵中的值对图着色
【发布时间】: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)

【问题讨论】:

    标签: r 3d plotly data-visualization


    【解决方案1】:

    您的数据本质上是线上的点 三个维度(XYW),因此不清楚您要绘制什么表面。 add_surface 期望 z-values 是一个 32x32 矩阵(因为 XY 各有 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)
    

    编辑

    要绘制 XYZ,请将 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 是您的 XY 向量的长度。您可以使用length(X) 进行检查。我已经编辑了我的答案
    • 非常感谢您的回答!我试图稍微修改你的答案 - 你能告诉我下面的代码是否有意义吗? (分号;表示新的代码行)
    • 代码看起来不错。请注意,1:n 生成的网格对于add_surface 而言可能过于粗糙。提供更精细的网格会更好(例如,使用seq(),就像您在上面所做的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多