2016-12-17 5 views
4

Gibt es in Matlab eine äquivalente Funktion in R der Funktion Scatter3? Scatterplot3d fehlen einige der Parameter.R-Version von Scatter3 (Matlab)

Beispiel: (Matlab)

N = 2^11; 
    t = rand(1,N); 
    t = sort(4*pi*sqrt(t))'; 
    z = 8*pi*rand(N,1); 
    x = (t+.1).*cos(t); 
    y = (t+.1).*sin(t); 

    cmap = jet(N); 
    scatter3(x,y,z,20,cmap); 

Graphical representation to be reproduced in R

Der "äquivalente" in R geben nicht die gleiche Art der Darstellung:

N = 2^11 
    t = runif(N) 
    t = sort(4*pi*sqrt(t)) 
    z = 8*pi*runif(N) 
    x = (t+0.1)*cos(t) 
    y = (t+0.1)*sin(t) 

    library(gplots) 
    cmap = rich.colors(N) 

    library(scatterplot3d) 
    par(mfrow = c(1,1)) 
    scatterplot3d(x,y,z, color = cmap, cex.symbols = 3, type = "b") 

Not the nice graphical representation as in matlab

+2

Welche Parameter es fehlt es? Bitte bearbeiten Sie Ihre Frage, um weitere Details hinzuzufügen. –

+0

überprüfen Sie auch die 'plot3D'-Paket, und [diese Präsentation] (http://pj.freefaculty.org/guides/Rcourse/plot-3d/plots-3d.pdf) –

+0

immer noch nicht klar, was Sie vermissen. Die Plots werden von verschiedenen Standardwinkeln betrachtet und die Farbkarte ist anders, aber ansonsten ...? –

Antwort

4

tl; dr zu meiner Überraschung, du hast Recht, dass scatterplot3d wirklich nicht diese Flexibilität hat (ich würde es getan haben geschworen). Ein sehr leichter Hack lässt Sie dies jedoch mit persp() tun.

Daten einrichten (danke für das reproduzierbare Beispiel).

N <- 2^11 
t <- runif(N) 
t <- sort(4*pi*sqrt(t)) 
z <- 8*pi*runif(N) 
x <- (t+0.1)*cos(t) 
y <- (t+0.1)*sin(t) 

Eine Farbkarte, die die übereinstimmt Sie ziemlich genau haben:

cmap <- colorRampPalette(c("blue","cyan"))(N) 

Der Trick ist, ein leeres persp() mit den richtigen Dimensionen einzurichten, die phi Einstellung und (optional) theta und r Parameter zum Einstellen der Anzeigeparameter. (phi=90 zeigt die x-y-Ebene an.) Verwenden Sie dann trans3d() mit der Transformationsmatrix, die von persp() zurückgegeben wird, um Ihre Punkte zu zeichnen.

## empty plot 
pp <- persp(range(x),range(y),matrix(c(min(z),max(z),0,0),2), 
     col=NA,border=NA,phi=90,zlab="") 
## plot: 
points(trans3d(x,y,z,pp),col=cmap) 

enter image description here

Dies sieht nicht wie Ihr Grundstück, weil (glaube ich) Sie isometrische Perspektive aktiviert haben. Um dies zu umgehen, den Blickpunkt einen langen Abstand von dem Objekt bewegen (dh gesetzt r auf einen großen Wert):

pp2 <- persp(range(x),range(y),matrix(c(min(z),max(z),0,0),2), 
     col=NA,border=NA,phi=90,r=1000) 
points(trans3d(x,y,z,pp2),col=cmap) 

enter image description here

(vergaß das hässliche z Etikett auf diese auszuschalten) .

Auf der anderen Seite, wenn alles, was Sie tun möchten, ist die Punkte in der x-y-Ebene zu sehen, warum nicht einfach nur alte plot() verwenden und die z-Koordinate ignorieren ???

plot(x,y,cex=5,col=cmap) 

enter image description here

+0

Danke! Das ist ein netter Trick. Das Ignorieren der Z-Achse und das Ausführen eines XY-Plots erledigt den Job, aber ich muss später alle Dimensionen plotten, und die Funktion perps() wird sich als nützlich erweisen. Nochmals vielen Dank für die klare Erklärung. – Ajmal

1

Wenn Sie interessieren sich für Interaktivität und Spiegelung was ist a vailble in Matlab, werfen Sie einen Blick auf die scatter3d Funktion angeboten über car Paket.

Der Code zur Verfügung über den Hilfe-Bereich:

require(car) 
if(interactive() && require(rgl) && require(mgcv)){ 
    scatter3d(prestige ~ income + education, data=Duncan) 
    Sys.sleep(5) # wait 5 seconds 
    scatter3d(prestige ~ income + education | type, data=Duncan) 
    Sys.sleep(5) 
    scatter3d(prestige ~ income + education | type, surface=FALSE, 
       ellipsoid=TRUE, revolutions=3, data=Duncan) 
    scatter3d(prestige ~ income + education, fit=c("linear", "additive"), 
       data=Prestige) 
    Sys.sleep(5) 
    scatter3d(prestige ~ income + education | type, 
       radius=(1 + women)^(1/3), data=Prestige) 
} 

Werden Sie ziemlich aufwendige 3D-Streudiagramm geben:

interactive

2

Mit nur geringfügigen Änderung einer Zeile des Codes, Sie mögen die gezeichnete Spirale:

scatterplot3d(x,z,y, color = cmap, cex.symbols = 1.2, pch=19, type = "b") 

enter image description here