2016-07-12 26 views
5

Chciałbym skorzystać z niesamowitych funkcji w Plotly, ale mam problem z wymyśleniem sposobu dodania płaszczyzny regresji do wykresu 3D rozproszenia. Oto przykład, jak zacząć od wykresu 3d, czy ktoś wie, jak zrobić następny krok i dodać samolot?Dodaj płaszczyznę regresji do wykresu punktowego 3D w 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) 

Odpowiedz

3

Trzeba spróbować punkty w oparciu o przewidywania obiektu utworzonego z połączenia lm. Tworzy to powierzchnię podobną do obiektu volcano, którą możesz następnie dodać do swojego wątku.

library(plotly) 
library(reshape2) 

#load data 

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

Poniżej przedstawiono zakres naszej powierzchni. Wybrałem próbkę co 0,05 punktu i wykorzystałem zasięg zestawu danych jako moje granice. Można go łatwo modyfikować tutaj.

#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 

W tym momencie mamy petal_lm_surface, który ma wartość Z dla każdego x i y chcemy wykresie. Teraz wystarczy, aby stworzyć podstawy wykresu (na punkty), dodając kolor i tekst dla każdego gatunku:

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

a następnie dodaj powierzchni:

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

Powiązane problemy