Построить трехмерную линейную поверхность из 2D функций в R

У меня есть следующие данные:

x <- c(1000,2000,3000,4000,5000,6000,8000,12000)

y_80 <- c(33276,33276,5913,2921,1052,411,219,146)
y_60 <- c(14724,14724,3755,1958,852,372,211,140)
y_40 <- c(9632,9632,2315, 1250,690,332,196,127)
y_20 <- c(4672,4672,1051,562,387,213,129,81)
y_5  <- c(825,825,210,118,88,44,27,17)

Из этих данных я создаю 5 сплайн-функций:

f_80 <- splinefun(x, y_80, method=c("monoH.FC"))
f_60 <- splinefun(x, y_60, method=c("monoH.FC"))
f_40 <- splinefun(x, y_40, method=c("monoH.FC"))
f_20 <- splinefun(x, y_20, method=c("monoH.FC"))
f_5 <- splinefun(x, y_5, method=c("monoH.FC"))

Ось Z - это число после f_, т. Е. Для функции f_80 значение Z равно 80 и т. Д.

Мне нужно было построить трехмерную поверхность из этих функций с линейной интерполяцией между линиями. Это возможно в R? У меня уже ТАК похожие вопросы, но я не могу найти ответ. Спасибо

1 ответ

Решение

Существует множество псевдо-3d функций построения графиков. базовая графика имеет persp, а также wireframe в решетке, и самый крутой из всех, surface3d находится в ргл. Они отличаются тем, как они обрабатывают аргументы оси, но все они обычно принимают матричный аргумент для z-значений. `persp самый простой:

 z_80 <- f_80(x)
 z_60 <- f_60(x)
 z_40 <- f_40(x)
 z_20 <- f_20(x)
 z_5  <- f_5(x) 

 png(); persp(matrix(c(z_80, z_60, z_40, z_20, z_5 ), nrow=length(x), 
              dimnames= list(X=x, Y=c(80,60,40,20,5) ) ) ) 
 dev.off()

Вы можете найти это, используя ticktype="detailed" более информативно:

 png(); persp(matrix(c(z_80,z_60,z_40,z_20,z_5 ), nrow=length(x), 
                      dimnames=list(X=x, Y=c(80,60,40,20,5) ) ) , 
                      ticktype="detailed", xlab="X axis", ylab="Y axis", 
                      zlab=".                Z= f(y)", theta=45) ; dev.off()

Мне обычно нужно поиграть с тета угла обзора, чтобы получить то, что мне нравится. Заставить метку оси Z отойти от длинных меток z-tick было взломом.

Другие вопросы по тегам