Я хотел бы построить тепловую карту, используя свою собственную математическую функцию вместо оценки плотности ядра. Но на данный момент моя проблема связана с тем, что я не могу построить эту функцию в 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