2016-07-12 45 views
5

Sto cercando di sfruttare le fantastiche funzioni di Plotly ma sto avendo difficoltà a capire come aggiungere un piano di regressione a un grafico a dispersione 3d. Ecco un esempio di come iniziare con la trama 3d, qualcuno sa come fare il passo successivo e aggiungere l'aereo?Aggiungi Regression Plane a 3D Scatter Plotly in Plotly

library(plotly) 
data(iris) 


iris_plot <- plot_ly(my_df, 
       x = Sepal.Length, 
       y = Sepal.Width, 
       z = Petal.Length, 
       type = "scatter3d", 
       mode = "markers") 

petal_lm <- lm(Petal.Length ~ 0 + Sepal.Length + Sepal.Width, 
       data = iris) 

risposta

3

È necessario campionare i punti basato sull'oggetto prevedere creato dal lm chiamata. Questo crea una superficie simile all'oggetto volcano che è possibile aggiungere alla trama.

library(plotly) 
library(reshape2) 

#load data 

my_df <- iris 
petal_lm <- lm(Petal.Length ~ 0 + Sepal.Length + Sepal.Width,data = my_df) 

Quanto segue imposta l'estensione della nostra superficie. Ho scelto di campionare ogni 0,05 punti e utilizzare l'estensione del set di dati come limiti. Può essere facilmente modificato qui.

#Graph Resolution (more important for more complex shapes) 
graph_reso <- 0.05 

#Setup Axis 
axis_x <- seq(min(my_df$Sepal.Length), max(my_df$Sepal.Length), by = graph_reso) 
axis_y <- seq(min(my_df$Sepal.Width), max(my_df$Sepal.Width), by = graph_reso) 

#Sample points 
petal_lm_surface <- expand.grid(Sepal.Length = axis_x,Sepal.Width = axis_y,KEEP.OUT.ATTRS = F) 
petal_lm_surface$Petal.Length <- predict.lm(petal_lm, newdata = petal_lm_surface) 
petal_lm_surface <- acast(petal_lm_surface, Sepal.Width ~ Sepal.Length, value.var = "Petal.Length") #y ~ x 

A questo punto, abbiamo petal_lm_surface, che ha il valore z per ogni xey vogliamo grafico. Ora abbiamo solo bisogno di creare il grafico di base (i punti), l'aggiunta di colore e testo per ogni specie:

hcolors=c("red","blue","green")[my_df$Species] 
iris_plot <- plot_ly(my_df, 
        x = Sepal.Length, 
        y = Sepal.Width, 
        z = Petal.Length, 
        text = Species, 
        type = "scatter3d", 
        mode = "markers", 
        marker = list(color = hcolors)) 

e quindi aggiungere la superficie:

iris_plot <- add_trace(last_plot = iris_plot, 
         z = petal_lm_surface, 
         x = axis_x, 
         y = axis_y, 
         type = "surface") 

iris_plot 

enter image description here

Problemi correlati