Создание трехмерного графика поверхности из двух векторов и матрицы - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть два вектора и 2D-матрица, из которой я хочу создать трехмерный график поверхности.Я уже разбил свои данные на 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, ords = 1: 3): Неверное измерение для строк

Я также пытался построить их с помощью plotly, но мой успех был таким же низким.

Может кто-нибудь дать мне информацию, какЯ могу сделать так, чтобы мои спектральные данные выглядели как последние (несколько поверхностей) на на этом сайте , индивидуально? Я попробую наложение поверхностей с plotly позже!

Я рад за каждый дополнительный вклад и информацию на моем уровне! Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2019

После просмотра исходного кода, я предполагаю, что проблема заключается в том, что вы сохранили свои x и y векторы в виде матриц.Если они являются матрицами, они должны быть идентичны по форме 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

, который производит этот график:

enter image description here

...