在回归中将回归平面添加到3d散点图

时间:2016-07-12 14:05:34

标签: r regression plotly r-plotly scatter3d

我希望利用Plotly中的强大功能,但我很难弄清楚如何将回归平面添加到3d散点图中。以下是如何开始使用3d绘图的示例,是否有人知道如何在下一步中添加平面并添加平面?

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)

4 个答案:

答案 0 :(得分:10)

您需要根据从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

此时,我们有petal_lm_surface,它为我们想要绘制的每个x和y都有z值。现在我们只需要创建基本图(点),为每个物种添加颜色和文本:

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(p = iris_plot,
                       z = petal_lm_surface,
                       x = axis_x,
                       y = axis_y,
                       type = "surface")

iris_plot

enter image description here

答案 1 :(得分:0)

我执行了代码,但是遇到错误,我在text = "Species"时更正了它,是的,它可以正确执行

答案 2 :(得分:0)

以此替换代码的绘图部分,还可以修复错误:

let trackStart = arrTracks![MediaPlayer.shared.currentSongNo].samples
let value = Float64(trackStart)
let seekTime = CMTime(value: CMTimeValue(value), timescale: 1)
MediaPlayer.shared.player?.seek(to: seekTime , completionHandler: { (completedSeek) in
                //do smthg later
            })

答案 3 :(得分:0)

我使用了相同的代码,但是当我执行最后一步以获取表面时,我得到了以下错误消息:

  

跟踪时出错[[i]] [[obj]]:     尝试在get1index中选择少于一个元素

因此,我在“ add_trace”中添加了一个术语:

  

继承= F

最后。