Как построить трехмерные матрицы, которые не возведены в квадрат в R?

Я хотел бы построить тепловую карту, используя свою собственную математическую функцию вместо оценки плотности ядра. Но на данный момент моя проблема связана с тем, что я не могу построить эту функцию в 3D, используя persp(), если мои оси x и y не возведены в квадрат. Действительно, тепловая карта имеет размер 855 x 670.

1) Есть ли способ решить эту проблему?

2) Кроме того, кто-нибудь знает, как превратить это в тепловую карту?

Заранее спасибо. Пожалуйста, найдите часть моего скрипта ниже.

–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Вот две функции, которые нам понадобятся:

rep.row <- function(x, n){
  matrix(rep(x, each = n), nrow = n)
}
rep.col <- function(x, n){
  matrix(rep(x, each = n), ncol = n, byrow = TRUE)
}

Это считывает изображение и извлекает его размеры (т.е. ширину и длину):

require('png')
png <- readPNG("myImage.png")
res <- dim(png)[2:1]

Для информации:

> dim(png)[2:1]
[1] 855 670

Это фиксированные параметры:

alphaW <- 53
alphaH <- 31
a <- 2.3

Я создаю два вектора (то есть e1 и e2) на основе размеров изображения. Следовательно, e1 имеет длину 855 ячеек, а e2 — 670 ячеек. Затем я использую функции выше, чтобы создать две матрицы (т. е. E1 и E2) одинакового размера изображения (т. е. 855 x 670).

e1 <- seq(-alphaW, alphaW, length = res[1])
e2 <- seq(-alphaH, alphaH, length = res[2])

E1 <- rep.row(e1, res[2])
E2 <- rep.col(e2, res[1])

Вычисление этих двух матриц используется для создания третьей матрицы, SV:

SV <- sqrt((a / (a + ((E1^2) + (E2^2)))))

Наконец, я хочу построить трехмерное представление этой матрицы:

persp(x = e1, y = e2, z = SV,
      col = "lightgoldenrod",
      border = NA,
      theta = 30,
      phi = 15,
      ticktype = "detailed",
      ltheta = -120,
      shade = 0.25)

Это должно вывести что-то вроде {это}, однако я получаю:

Error in persp.default(e1, e2, SV, col = "lightgoldenrod", border = NA,  :
argument 'z' incorrect

person Mickaël Perrier    schedule 12.10.2016    source источник
comment
Легче помочь, если вы предоставите воспроизводимый пример, который не не требуют файлов изображений, к которым у нас нет доступа.   -  person MrFlick    schedule 12.10.2016
comment
На самом деле любой файл .png был бы в порядке. Но я полностью понимаю проблему, связанную с тем, что вы не можете просто скопировать/вставить и вычислить. Виноват. Хотя моя проблема решена. Спасибо за уделенное время.   -  person Mickaël Perrier    schedule 12.10.2016


Ответы (1)


Вы поменяли местами x и y. Если вы посмотрите на страницу справки для persp(), вы заметите, что x должен иметь длину nrow(z), а y длину ncol(z). Таким образом, хотя интуитивно вы можете ожидать, что строки будут располагаться на вертикальной оси (как вы визуализируете матрицу), кажется, что все наоборот.

Это работает:

persp(y = e1, x = e2, z = SV,
      col = "lightgoldenrod",
      border = NA,
      theta = 30,
      phi = 15,
      ticktype = "detailed",
      ltheta = -120,
      shade = 0.25)
person Wave    schedule 12.10.2016
comment
Ну… Это было просто. Большое спасибо! - person Mickaël Perrier; 12.10.2016