Saya ingin memplot peta panas menggunakan fungsi matematika saya sendiri alih-alih estimasi kepadatan Kernel. Tetapi untuk saat ini masalah saya berasal dari kenyataan bahwa saya tidak dapat memplot fungsi ini secara 3D menggunakan persp()
jika sumbu x
& y
saya tidak persegi. Memang peta panasnya berukuran 855 x 670.
1) Apakah ada cara untuk mengatasi masalah ini?
2) Plus, adakah yang tahu cara mengubahnya menjadi peta panas?
Terima kasih sebelumnya. Silakan temukan bagian dari skrip saya di bawah ini.
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Berikut adalah dua fungsi yang kita perlukan:
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)
}
Ini membaca gambar dan mengekstrak dimensinya (yaitu lebar dan panjang):
require('png')
png <- readPNG("myImage.png")
res <- dim(png)[2:1]
Untuk informasi:
> dim(png)[2:1]
[1] 855 670
Ini adalah parameter tetap:
alphaW <- 53
alphaH <- 31
a <- 2.3
Saya membuat dua vektor (yaitu e1
dan e2
) berdasarkan dimensi gambar. Oleh karena itu, e1
panjangnya 855 sel dan e2
panjangnya 670 sel. Kemudian saya menggunakan fungsi di atas untuk membuat dua matriks (yaitu E1
dan E2
) dengan ukuran gambar yang sama (yaitu 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])
Perhitungan kedua matriks ini digunakan untuk membuat matriks ke-3, SV
:
SV <- sqrt((a / (a + ((E1^2) + (E2^2)))))
Akhirnya saya ingin memplot representasi 3D dari matriks ini:
persp(x = e1, y = e2, z = SV,
col = "lightgoldenrod",
border = NA,
theta = 30,
phi = 15,
ticktype = "detailed",
ltheta = -120,
shade = 0.25)
Ini akan menghasilkan sesuatu seperti {ini}, namun, saya menerima:
Error in persp.default(e1, e2, SV, col = "lightgoldenrod", border = NA, :
argument 'z' incorrect