2017-06-06 142 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