从两个向量和一个矩阵创建 3D 曲面图
Creating a 3D surface plot from two vectors and a matrix
我有两个向量和一个二维矩阵,我想从中创建一个 3D 曲面图。我已经将我的数据分成 X 和 Y(矢量(时间 "t" 和波长 "w")和 Z(矩阵;时间和波长的吸光度 "NIR"),具有相同数量的 rows/columns 分别为:
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
覆盖表面!
对于我的水平上的每一个额外输入和信息,我都很高兴!
谢谢!
查看源代码后,我猜问题出在您将 x
和 y
向量存储为矩阵。如果它们是矩阵,则它们的形状必须与 z
相同。
正如我在评论中提到的,您应该避免使用 rgl.surface
(大多数情况下还有其他 rgl.*
函数),而是使用 surface3d
或 persp3d
如果你想要坐标轴。
*3d
函数是更高级的函数,其行为更像其他 R 函数,并且它们在较长的 运行.
中会导致更少的问题
您还没有 post 任何数据,所以我将 post 一个完全人为的例子。假设 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
产生这个情节:
我有两个向量和一个二维矩阵,我想从中创建一个 3D 曲面图。我已经将我的数据分成 X 和 Y(矢量(时间 "t" 和波长 "w")和 Z(矩阵;时间和波长的吸光度 "NIR"),具有相同数量的 rows/columns 分别为:
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
覆盖表面!
对于我的水平上的每一个额外输入和信息,我都很高兴! 谢谢!
查看源代码后,我猜问题出在您将 x
和 y
向量存储为矩阵。如果它们是矩阵,则它们的形状必须与 z
相同。
正如我在评论中提到的,您应该避免使用 rgl.surface
(大多数情况下还有其他 rgl.*
函数),而是使用 surface3d
或 persp3d
如果你想要坐标轴。
*3d
函数是更高级的函数,其行为更像其他 R 函数,并且它们在较长的 运行.
您还没有 post 任何数据,所以我将 post 一个完全人为的例子。假设 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
产生这个情节: