Попытка воспроизвести 3D-изображение в R of Rate или Proportion с помощью plot3D

На днях я видел это трехмерное изображение в журнале, в котором описывается эволюция коэффициента рождаемости с течением времени в период с 1980 по 1999 год по возрастам. Вертикальная линия — рождаемость. Две горизонтальные линии — это возраст и год.

введите здесь описание изображения

Очень хочется воспроизвести такую. Я могу представить, что данные будут выглядеть примерно так (упрощенно)

dta = cbind(c(2000, 2005, 2015), 
  c(15, 20, 25), 
  c(20, 24, 35))

colnames(dta) <- c('year', 'age', 'rate')

 year age rate
 2000  15   20
 2005  20   24
 2015  25   35

Я искал некоторые 3D-библиотеки, и вышел пакет plot3D. Я пытался понять, как работает функция outer(), но так и не понял!

Есть ли у вас какие-либо идеи, как я мог бы воспроизвести 3D-график, подобный приведенному выше?


person giac    schedule 18.06.2015    source источник
comment
Попробуйте это, чтобы понять функцию outer. outer(1:10,1:10,FUN="+").   -  person user1436187    schedule 18.06.2015


Ответы (2)


Попробуй это:

library(graphics)
dta = cbind(c(2000, 2005, 2015), 
        c(15, 20, 25), 
        c(20, 24, 35))

colnames(dta) <- c('year', 'age', 'rate')
dta = as.data.frame(dta)
persp(dta$year, dta$age, matrix(runif(9),3,3), theta = 30, phi = 30, expand = 0.5, col = "lightblue",
      ltheta = 120, shade = 0.75, ticktype = "detailed",
      xlab = "year", ylab = "age", zlab = "rate")

Ссылка: demo(persp) в R

Примечание. Третий аргумент (z) должен быть матрицей

person user1436187    schedule 18.06.2015
comment
Я получил ошибку из вашего примера Ошибка в persp.default(dta$year, dta$age, dta$rate, theta = 30, phi = 30, : недопустимый аргумент 'z' - person giac; 18.06.2015
comment
Проверьте, является ли class(dta$rate) фактором. - person user1436187; 18.06.2015
comment
Ошибка в if (any(diff(x) ‹= 0) || any(diff(y) ‹= 0)) stop(ожидается увеличение значений 'x' и 'y') : отсутствует значение, где ИСТИНА/ЛОЖЬ необходимо дополнительно: Предупреждающие сообщения: 1: In Ops.factor(diff(x), 0): '‹=' не имеет значения для факторов 2: In Ops.factor(diff(y), 0): '‹=' не имеет значение для факторов - person giac; 18.06.2015
comment
не могли бы вы опубликовать сюжет, который вы получили? - person giac; 18.06.2015
comment
Вы правы z должна быть матрица. Каждый элемент в матрице показывает высоту точек на поверхности. Вам нужно больше значений для создания поверхности. - person user1436187; 18.06.2015

Я предпочитаю функцию plot3d из пакета "rgl". Поскольку у вас всего несколько точек, я скорректировал пределы, чтобы вы могли их видеть.

library("rgl") plot3d(dta, xlim=c(1990, 2030), ylim=c(10,30), zlim=c(15,40))

person Ivo Fugers    schedule 18.06.2015