2016-10-12 1 views
0

Ich möchte eine Heatmap mit meiner eigenen mathematischen Funktion anstelle der Kerndichte-Schätzung darstellen. Aber im Moment kommt mein Problem von der Tatsache, dass ich diese Funktion mit persp() 3D nicht zeichnen kann, wenn meine & y Achsen nicht quadriert sind. In der Tat hat die Heatmap eine Größe von 855 x 670.Wie werden 3D-Plotmatrizen in R nicht quadriert?

1) Gibt es eine Möglichkeit, dieses Problem zu lösen?

2) Und weiß jemand, wie man das in eine Heatmap umwandelt?

Vielen Dank im Voraus. Bitte finden Sie einen Teil meines Skripts unten.

---------------------------------------------- ---------------------------------

Hier sind zwei Funktionen, die wir benötigen:

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) 
} 

Diese liest ein Bild und extrahiert seine Abmessungen (dh, die Breite und Länge):

require('png') 
png <- readPNG("myImage.png") 
res <- dim(png)[2:1] 

Informationen:

> dim(png)[2:1] 
[1] 855 670 

Diese sind feste Parameter:

alphaW <- 53 
alphaH <- 31 
a <- 2.3 

I erstellen zwei Vektoren (d.h. e1 und e2) basierend auf den Bildabmessungen. Daher ist e1 855-Zellen lang und e2 ist 670-Zellen lang. Dann verwende ich die obigen Funktionen, um zwei Matrizen (d. H. E1 und E2) mit derselben Größe des Bildes (d. H. 855 x 670) zu erzeugen.

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]) 

Eine Berechnung dieser beiden Matrizen verwendet, um eine dritte Matrix zu erstellen, SV:

SV <- sqrt((a/(a + ((E1^2) + (E2^2))))) 

Schließlich möchte ich eine 3D-Darstellung dieser Matrix zeichnen:

persp(x = e1, y = e2, z = SV, 
     col = "lightgoldenrod", 
     border = NA, 
     theta = 30, 
     phi = 15, 
     ticktype = "detailed", 
     ltheta = -120, 
     shade = 0.25) 

Diese sollte etwas wie {this} ausgeben, jedoch erhalte ich:

Error in persp.default(e1, e2, SV, col = "lightgoldenrod", border = NA, : 
argument 'z' incorrect 
+0

Es ist einfacher zu helfen, wenn Sie ein [reproduzierbares Beispiel] liefern (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r- Beispiel), für das keine Bilddateien benötigt werden, auf die wir keinen Zugriff haben. – MrFlick

+0

Jede .png-Datei wäre eigentlich in Ordnung gewesen. Aber ich verstehe das Problem vollständig, dass man nicht einfach kopieren und einfügen kann. Mein Fehler. Mein Problem ist jedoch gelöst. Vielen Dank für Ihre Zeit. –

Antwort

1

Sie haben x und y gewechselt. Wenn Sie sich die Hilfeseite für persp() ansehen, werden Sie feststellen, dass x Länge nrow (z) und y Länge ncol (z) haben sollte. Obwohl Sie intuitiv erwarten können, dass Zeilen auf der vertikalen Achse liegen (wie Sie die Matrix visualisieren), scheint es umgekehrt zu sein.

Dies funktioniert:

persp(y = e1, x = e2, z = SV, 
     col = "lightgoldenrod", 
     border = NA, 
     theta = 30, 
     phi = 15, 
     ticktype = "detailed", 
     ltheta = -120, 
     shade = 0.25) 
+0

Nun ... Das war einfach. Danke vielmals! –

Verwandte Themen