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】:

您的数据本质上是线上的点 三个维度(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(),就像您在上面所做的那样。

以上是关于R 错误:根据矩阵中的值对图着色的主要内容,如果未能解决你的问题,请参考以下文章

根据不同的比例对图的节点进行着色

使用 dplyr 根据列值对 R 中的值求和

Arcgis应用(十三)根据图层字段属性值对图斑进行融合

线图的matlab颜色条按值着色

根据Java中的值对地图进行排序的最简单方法是啥?

如何在angular-ui-grid中的特定值上为行着色?