【问题标题】:Creating a 3D surface plot from two vectors and a matrix从两个向量和一个矩阵创建 3D 曲面图
【发布时间】:2019-04-23 14:30:36
【问题描述】:

我有两个向量和一个 2D 矩阵,我想从中创建一个 3D 曲面图。我已经将我的数据分成 X 和 Y(向量(时间“t”和波长“w”)和 Z(矩阵;在时间和波长处的吸光度“NIR”),分别具有相同数量的行/列:

t = matrix(1:456, ncol= 1)
w = matrix(1350:1650, nrow = 1)
NIR = as.matrix(read.table("NIR_alle_pur.txt", header = TRUE, dec =","))
colnames(NIR) = c(paste0("NIR.", 1350:1650))
dim(NIR)
# [1] 456 301
dput(NIR_example)
structure(c(60771.93, 57230.56, 56235.96, 41617.47, 41709.93, 
57466.6, 59916.97, 63376.4, 41966.73, 41254.34, 65535, 61468.76, 
65535, 41238.03, 42530.97, 56936.03, 65009.4, 65535, 40375.5, 
41021.6, 62757, 65455.44, 63795.6, 41349.6, 41178.2), .Dim = c(5L, 
5L), .Dimnames = list(NULL, c("NIR.Spectrum_1350.0000000", "NIR.Spectrum_1351.0000000", 
"NIR.Spectrum_1352.0000000", "NIR.Spectrum_1353.0000000", "NIR.Spectrum_1354.0000000"
)))

我试图将它们插入到rgl.surface 函数中,但我收到以下错误消息:

rgl.surface(x, y, z, coords = 1:3) 中的错误:行尺寸错误

我也尝试用plotly 绘制它们,但我的成功率同样很低。

谁能给我一个输入,我如何让我的光谱数据看起来像this site 上的最后一个(多个表面),单独?稍后我将尝试使用plotly覆盖表面!

对于我关卡中的每一个额外输入和信息,我都很高兴! 谢谢!

【问题讨论】:

  • 你能用dput展示一些示例数据吗?从您写的内容来看,我感觉您的数据是 4D(来自 x、y 的 2D 和来自矩阵的 2D),那么您的“第三维”到底是什么?
  • 两个cmets:你应该发布一个简单的例子来展示你的数据结构。我怀疑问题是您已经将Z 转换为应有的内容,但是如果没有示例代码,我不确定。其次,您应该使用surface3d 而不是较低级别的rgl.surface。它的行为更像其他 R 图形函数。请注意,参数略有不同,因此您可能需要修改代码。
  • @symbolrush 我得到了不同波长的光谱数据:向量 x,y 是时间和波长,矩阵 z 描述了特定时间和波长的吸光度。我将使用数据编辑我的问题,让您了解我正在处理的内容。我认为我将问题缩小到矩阵并且存在格式错误......

标签: r plot surface rgl


【解决方案1】:

查看源代码后,我猜问题在于您将xy 向量存储为矩阵。如果它们是矩阵,它们的形状必须与z 相同。

正如我在评论中提到的,您应该避免使用 rgl.surface(以及大多数情况下的其他 rgl.* 函数),而是使用 surface3d,或者如果您想要轴,则使用 persp3d

*3d 函数是更高级的函数,其行为更像其他 R 函数,从长远来看,它们会导致更少的问题。

您还没有发布任何数据,所以我将发布一个完全人为的示例。假设z = x^2 + y^2 + a,其中a 是每个表面的不同常数。然后你可以像这样绘制它:

x <- seq(-2, 2, length = 7) 
y <- seq(-3, 3, length = 5)  # I've chosen different ranges 
                             # and lengths just to illustrate.
z <- outer(x, y, function(x, y) x^2 + y^2)

colours <- heat.colors(100)
minval <- min(z)
maxval <- max(z) + 10
col <- colours[(z - minval)/(maxval - minval)*99 + 1]
persp3d(x, y, z, col = col)  # get axes the first time

z <- outer(x, y, function(x, y) x^2 + y^2 + 5)
col <- colours[(z - minval)/(maxval - minval)*99 + 1]
surface3d(x, y, z, col = col)  

z <- outer(x, y, function(x, y) x^2 + y^2 + 10)
col <- colours[(z - minval)/(maxval - minval)*99 + 1]
surface3d(x, y, z, col = col) 

aspect3d(1, 1, 1)  # Make axes all equal

这会产生这个情节:

【讨论】:

  • 感谢您的示例,我将尝试在我的数据上实现它。你会这么好心并快速浏览一下我编辑过的帖子吗?非常感谢!
  • tw 是矩阵,而不是向量。
  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多