จะพล็อตเมทริกซ์ 3 มิติที่ไม่ยกกำลังสองใน R ได้อย่างไร

ฉันต้องการพล็อตแผนที่ความร้อนโดยใช้ฟังก์ชันทางคณิตศาสตร์ของฉันเอง แทนที่จะใช้การประมาณความหนาแน่นของเคอร์เนล แต่ในขณะนี้ ปัญหาของฉันมาจากข้อเท็จจริงที่ว่าฉันไม่สามารถพลอตฟังก์ชันนี้แบบ 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

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 length 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