Bagaimana cara memplot matriks 3D yang tidak dikuadratkan di R?

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

person Mickaël Perrier    schedule 12.10.2016    source sumber
comment
Akan lebih mudah untuk membantu jika Anda memberikan contoh yang dapat direproduksi yang tidak tidak memerlukan file gambar yang tidak dapat kami akses.   -  person MrFlick    schedule 12.10.2016
comment
File .png apa pun sebenarnya baik-baik saja. Tapi saya benar-benar memahami masalah yang timbul dari kenyataan bahwa Anda tidak bisa hanya menyalin/menempel dan menghitung. Salahku. Masalahku sudah terpecahkan. Terima kasih atas waktu Anda.   -  person Mickaël Perrier    schedule 12.10.2016


Jawaban (1)


Anda mengganti x dan y. Jika Anda melihat halaman bantuan untuk persp(), Anda akan melihat bahwa x harus memiliki panjang nrow(z) dan y panjang ncol(z). Jadi meskipun secara intuitif Anda mungkin mengharapkan baris berada pada sumbu vertikal (cara Anda memvisualisasikan matriks), tampaknya yang terjadi adalah sebaliknya.

Ini bekerja:

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
Ya… Itu sederhana. Terima kasih banyak! - person Mickaël Perrier; 12.10.2016