ฉันต้องการพล็อตแผนที่ความร้อนโดยใช้ฟังก์ชันทางคณิตศาสตร์ของฉันเอง แทนที่จะใช้การประมาณความหนาแน่นของเคอร์เนล แต่ในขณะนี้ ปัญหาของฉันมาจากข้อเท็จจริงที่ว่าฉันไม่สามารถพลอตฟังก์ชันนี้แบบ 3 มิติโดยใช้ 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])
การคำนวณของเมทริกซ์ทั้งสองนี้ใช้เพื่อสร้างเมทริกซ์ตัวที่ 3, SV
:
SV <- sqrt((a / (a + ((E1^2) + (E2^2)))))
ในที่สุดฉันต้องการพล็อตการแสดง 3 มิติของเมทริกซ์นี้:
persp(x = e1, y = e2, z = SV,
col = "lightgoldenrod",
border = NA,
theta = 30,
phi = 15,
ticktype = "detailed",
ltheta = -120,
shade = 0.25)
สิ่งนี้ควรส่งออกผลลัพธ์เช่น {this} อย่างไรก็ตาม ฉันได้รับ:
Error in persp.default(e1, e2, SV, col = "lightgoldenrod", border = NA, :
argument 'z' incorrect