2013-04-21 16 views
6

Ich schreibe einen Vorschlag und brauchen einen 3D-Plot etwas wie folgt aus:Attraktive 3D-Plot in R

enter image description here

aber vorzugsweise attraktiver zu gestalten. Ich brauche die Größe jedes Punktes, um die Fülle der Arten zu reflektieren und einen Überblick über das Volumen, das durch die Verbindung der Punkte entsteht.

Beispieldaten:

input<-data.frame(
label=c("sp1","sp2","sp3","sp4"), 
trait_x=c(6,6,6,1), 
trait_y=c(7,7,7,1), 
trait_z=c(8,8,8,1), 
point_size=c(6,7,8,1) 
) 
input 
    label trait_x trait_y trait_z point_size 
1 sp1  6  7  8  6 
2 sp2  6  7  8  7 
3 sp3  6  7  8  8 
4 sp4  1  1  1  1 

Jeder Vorschlag, wie eine solche grafische Darstellung attraktiver zu machen (vielleicht einschließlich Rasterlinien Ich möchte keine Zahlen auf den Achsen jedoch?)

ich gespielt habe, um mit scatterplot3d, aber es funktioniert nicht plotten alle meine Punkte und ich persönlich finde, dass der Würfel einen seltsamen Blick zu ihm hat ... wie es nicht ganz richtig ist ...

library(scatterplot3d) 
x<-input$trait_x 
y<-input$trait_y 
z<-input$trait_z 
scatterplot3d(x,y,z,xlim=c(0,10),ylim=c(0,10),zlim=c(0,10)) 

enter image description here

+0

Können Sie zeigen, was Sie versucht haben? –

+0

Sicher, nur jetzt hinzufügen. – Elizabeth

+1

Ist es eher eine Illustration als eine exakte Darstellung? Wenn Sie nur vier Blobs haben, ist es vielleicht einfacher, sie mit einem Grafikpaket zu zeichnen. Die andere Option ist das rgl-Paket, das dynamische 3D-Grafiken ausführt. – Spacedman

Antwort

14

Dies sollte Ihnen den Einstieg in das Paket rgl ermöglichen. Hinweis: Beim erneuten Lesen sehe ich, dass ich Ihre xyz-Koordinaten etwas anders benutze als Sie, aber das Konzept ist dasselbe.

input<-data.frame(# I adjusted the values for better appearance in demo 
label=c("sp1","sp2","sp3","sp4"), 
trait_x=c(6,7,11,1), 
trait_y=c(10,7,9,1), 
trait_z=c(4,7,6,1), 
point_size=c(6,7,8,1) 
) 
names(input) <- c("name", "x", "y", "z", "radius") 
input$radius <- input$radius*0.2 

require("rgl") 

spheres3d(input[,2:4], radius = input[,5], col = c("red", "green", "blue", "orange"), alpha = 0.5) 
axes3d(box = TRUE) 
title3d(xlab = "x_trait", ylab = "y_trait", zlab = "z_trait") 
text3d(input[1,2:4], texts = "species X") 
# next line is clunky but you can do it more elegantly 
segs <- rbind(input[1:2,2:4], input[2:3,2:4], input[3:4,2:4], input[c(4,1),2:4]) 
segments3d(segs) 

Jetzt können Sie Ihr Diagramm interaktiv drehen und dann rgl.snapshot verwenden, um eine Hardcopy zu bekommen (Anti-Aliasing-Argumente in spheres3d verwendet, wird das Diagramm verbessern).

enter image description here

+0

Sehr hübsch! Danke, Bryan. Anstatt die Mittelpunkte jedes Punktes mit Linien zu verbinden, weißt du sowieso, wie viel Volumen diese Punkte im 3D - Raum erzeugen (dh was als konvexes Rumpfvolumen bezeichnet wird), im Grunde genommen schrumpft man um alle Punkte und zeigt das "Wolke" von Raum, den die Punkte einnehmen) Sorry, meine Erklärung ist ein bisschen grob. Weißt du was ich meine? – Elizabeth

+0

Ich weiß, wovon du sprichst, aber noch nie. Ich bin mir ziemlich sicher, dass es in einer Reihe von Paketen implementiert ist: 'install.packages (" sos "); Bibliothek ("sos"); findFn ("konvexe Hülle") '. Aber denken Sie daran, dass Ihre Punkte wirklich Kugeln um einen Punkt sind, überlegen Sie sich also genau, was eine solche Schrumpfung in Bezug auf die Wissenschaft bedeuten würde. Abhängig von der Bedeutung Ihrer Dimensionen und der Kugelgröße wäre vielleicht etwas wie ein Ellipsoid geeigneter (aber meistens erwähne ich das, weil ich weiß, wie das geht!). –

+0

Wahr. Sie haben mehr als meine Frage beantwortet, aber ich werde jetzt frech sein und fragen, wie man ein Ellipsoid auf den vorhandenen Graphen anwendet, um die Zahlen auf den Achsen loszuwerden. :) – Elizabeth