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)
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
コードのプロット部分をこれに置き換えると、エラーも修正されます。
attach(my_df)
iris_plot <- plot_ly(my_df,
x = ~Sepal.Length,
y = ~Sepal.Width,
z = ~Petal.Length,
text = Species,
type = "scatter3d",
color = ~Species,
colors = c("red","blue","green"),
mode = "markers")
同じコードを使用しましたが、最後の手順を実行してサーフェスを取得すると、次のエラーメッセージが表示されます。
トレースのエラー[[i]] [[obj]]:get1indexで1つ未満の要素を選択しようとしました
したがって、「add_trace」に次のように1つの用語を追加します。
継承= F
最後に。
コードを実行しましたが、エラーが発生しました。text = "Species"
そしてはいそれは正しく実行されました