2016-11-15 5 views
7

Ich habe eine Liste a mit drei Matrizen und einen Vektor h mit drei Höhen (jede positive reelle Zahl). Diese Matrizen bilden Dreiecke, dh die Basis des Prismas. Ich möchte die Informationen des Vektors h hinzufügen, um Prismen zu konstruieren.Plot 3D Prismen mit ggplot2 und plotly

Ich habe eine Funktion zum Zeichnen von Grafiken in 2D (pplot) erstellt. Wie kann ich die Prismen wie in der folgenden Abbildung darstellen?

pplot Lassen und ein Spielzeug Problem ein Beispiel sein:

library(ggplot2) 
pplot <- function(polygon){ 
    polygon <- lapply(polygon, function(x) {colnames(x) <- NULL; x}) 
    vertex_number = nrow(polygon[[1]]) 
    g = ggplot2::ggplot() 
    names(polygon) = 1:length(polygon) 
    k <- plyr::ldply(polygon, function(x) data.frame(x)) 
    g <- ggplot2::ggplot(k, ggplot2::aes(x = X1, y = X2, group = .id)) + ggplot2::geom_polygon(colour = "black", fill = NA) 
    return(g) 
} 

a <- list() 
b1 <- matrix(rnorm(6), ncol = 2) 
b2 <- matrix(rnorm(6), ncol = 2) 
b3 <- matrix(rnorm(6), ncol = 2) 

a[[1]] <- b1 
a[[2]] <- b2 
a[[3]] <- b3 

h <- c(.3, .5, .1) 
#pplot function example 
pplot(a) 

Grafik gewünschten

An example desired

Wo die Koordinate a = d, b = f, c = e sind Ecken und alle Informationen in a.

Bemerkung 1: Die Daten müssen eine Liste enthalten.

Bemerkung 2: Ich habe einen Beitrag in Portugiesisch erstellt, aber niemand hat geantwortet. Kann ich das tun oder es betrügt? (Ich bin neu hier) https://pt.stackoverflow.com/questions/165538/plotar-figuras-3d-para-dados-em-lista

+0

Ich dachte ggplot nicht 3D zu tun haben. Können Sie uns auf ein Beispiel hinweisen, in dem diese Vermutung sich als falsch erwiesen hat? –

+0

Ein Beispiel kann in gesehen werden: https://www.r-bloggers.com/3d-plots-with-ggplot2-and-plotly/ –

+0

Wie ich diesen Blog lese, ist es plotly, dass der 3D-razzmatazz macht. –

Antwort

4

Ich bin nicht 100% sicher, dass ich die Aufgabe richtig verstanden habe. Trotzdem hier ein Entwurf für eine Lösung mit dem Paket rgl. Meiner Meinung nach ist es immer noch das beste 3D-Plot-Framework für R, weil es viel schneller ist und besser skaliert als die JavaScript-APIs (plotly, rthreejs usw.).

#### load package rgl #### 
library(rgl) 

set.seed(1232) 

#### construct test list with coordinate matrices #### 
a <- list() 
b1 <- matrix(rnorm(6), ncol = 2) 
b2 <- matrix(rnorm(6), ncol = 2) 
b3 <- matrix(rnorm(6), ncol = 2) 

a[[1]] <- b1 
a[[2]] <- b2 
a[[3]] <- b3 

#### define test height vector #### 
h <- c(.3, .5, .1) 

#### simple plot prism function #### 
# a: list with coordinate matrices 
# h: height vector 
plotprism <- function(a, h){ 
    # general loop to plot every prism 
    for(i in 1:length(h)){ 
    # transform matrizes to data.frames and add height column 
    # -> separation of top and bottom triangle 
    top <- data.frame(a[[i]], h[i]) 
    bottom <- data.frame(a[[i]], 0) 
    # adjust colnames to axis names 
    colnames(top) <- c("x", "y", "z") 
    colnames(bottom) <- c("x", "y", "z") 
    # plot triangles (as wireframes) 
    triangles3d(bottom, front = "line", back = "line") 
    triangles3d(top, front = "line", back = "line") 
    # plot vertical lines to connect the triangles 
    for(i in 0:2){ 
     segments3d(
     x = c(bottom$x[1+i], top$x[1+i]), 
     y = c(bottom$y[1+i], top$y[1+i]), 
     z = c(bottom$z[1+i], top$z[1+i]) 
    ) 
    } 
    } 
    #### add coordinate system #### 
    axes3d() 
} 

#### call plot function for test data #### 
plotprism(a, h) 

Die Ergebnisse: enter image description here

+0

Vielen Dank! –