2016-07-12 2 views
5

Plotly의 멋진 기능을 활용하고 싶지만 3D scatter plot에 회귀 평면을 추가하는 방법을 알아 내려고 노력하고 있습니다. 다음은 3D 플롯을 시작하는 방법의 예입니다. 누군가 다음 단계를 수행하고 평면을 추가하는 방법을 알고 있습니까?Plotly에서 3D Scatter Plot에 회귀 평면 추가

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) 

답변

3

당신은 당신의 lm 호출에서 생성 된 예측 개체를 기반으로 포인트를 샘플링 할 필요가있다. 그러면 플롯에 추가 할 수있는 volcano 객체와 비슷한 서페이스가 만들어집니다.

library(plotly) 
library(reshape2) 

#load data 

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

다음은 표면의 범위를 설정합니다. 나는 매 0.05 포인트를 샘플링하고 데이터 세트의 범위를 나의 한계로 사용했다. 여기에서 쉽게 수정할 수 있습니다. 이때

#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 

우리는 그래프하려는 모든 X 및 Y에 대한 Z 값이 petal_lm_surface을 갖는다. 이제 우리는 단지 각 종 색상 및 텍스트 추가, 기본 그래프 (포인트)를 만들어야합니다

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

을 한 후 표면 추가 :

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

관련 문제