2017-06-06 273 views
1

我想用plotly包建立一個3D PCA雙情節,因爲這個圖形很好,並且以html格式(我需要的)交互。3D情節劇情 - R

我的困難是添加加載。我想加載從點(0,0,0)(即相當於二維雙外殼)

點直線呈現所以總而言之,我不知道如何添加從3D圖形中心開始的直線。

我已經使用PCA函數計算了分數和加載;

pca1 <- PCA (dat1, graph = F) 

爲分數:

ind1 <- pca1$ind$coord[,1:3] 
x <- ind1[,1] ; y <- ind1[,2] ; z <- ind1[,3] 

爲負載:

var1 <- pca1$var$coord[,1:3] 
xl <- var1[,1] ; yl <- var1[,2] ; zl <- var1[,3] 

和使用波紋管被生成的3D得分圖的代碼;

p <- plot_ly(x=x, y=y, z=z, 
marker = list(opacity = 0.7, color=y , colorscale = c('#FFE1A1', '#683531'), showscale = F)) %>% 
    layout(title = "3D Prefmap", 
     scene = list(
      xaxis = list(title = "PC 1"), 
      yaxis = list(title = "PC 2"), 
      zaxis = list(title = "PC 3"))) 

回答

1

這裏有一些想法可以用於開發3D雙標圖。

# Data generating process 
library(MASS) 
set.seed(6543) 
n <- 500 
mu <- c(1,-2,3,-1,3,4) 
Sigma <- diag(rep(1,length(mu))) 
Sigma[3,1] <- Sigma[1,3] <- 0.1 
Sigma[4,6] <- Sigma[6,4] <- 0.1 
X <- as.data.frame(mvrnorm(n, mu=mu, Sigma=Sigma)) 

# PCA 
pca <- princomp(X, scores=T, cor=T) 

# Scores 
scores <- pca$scores 
x <- scores[,1] 
y <- scores[,2] 
z <- scores[,3] 

# Loadings 
loads <- pca$loadings 

# Scale factor for loadings 
scale.loads <- 5 

# 3D plot 
library(plotly) 
p <- plot_ly() %>% 
    add_trace(x=x, y=y, z=z, 
      type="scatter3d", mode="markers", 
      marker = list(color=y, 
       colorscale = c("#FFE1A1", "#683531"), 
       opacity = 0.7)) 

for (k in 1:nrow(loads)) { 
    x <- c(0, loads[k,1])*scale.loads 
    y <- c(0, loads[k,2])*scale.loads 
    z <- c(0, loads[k,3])*scale.loads 
    p <- p %>% add_trace(x=x, y=y, z=z, 
      type="scatter3d", mode="lines", 
      line = list(width=8), 
      opacity = 1) 
} 
print(p) 

enter image description here

+0

它完美的作品!感謝Marco! – Elef