library(scatterplot3d)
library(plot3D)
#definir los puntos más alejados del plano
x <- c(0,10)
y <- c(0,10)
z <- c(0,10)
#Se realiza la base de un plano usando los puntos más lejanos y almacenando la gráfica en una variable 
s <- scatterplot3d(x,y,z, color = "white",main = "Vectores en 3D \n Vectores de pH y Materia Orgánica (MO)",cex.axis = 0.7,
                   sub = " Nota: los porcentajes de Materia organica \n estan divididos entre 10",
                   col.grid = "lightgrey",xlab = "X",ylab = "Y",zlab ="Z",cex.lab = 0.8 )

#Trazado de segmentos para la ubicación de las coordenadas del Vector pH
#Punto de origen en (0,0,0)
PV1 <- s$xyz.convert(0,0,0) #Se realiza la transformación de un sistemas de coordenadas X, Y y Z a un paralelo en coordenadas X y Y en una gráfica existente.
pH <- c(4.5,7.8,9.5)  #Se define los valores de pH 
pHXYZ <- s$xyz.convert(pH[1],pH[2],pH[3]) #Se realiza la transformación de las coordenadas de un sistema al otro
A1 <- s$xyz.convert(pH[1],0,0)  #Se define el segundo punto de uno de los segmentos 
A2 <- s$xyz.convert(pH[1],pH[2],0) #Se define el tercer punto de uno de los segmentos
segments(A1$x,A1$y,A2$x,A2$y, col = "lightblue") #Para el segmento se define el punto de inicio y de final, además de que permite definir el grosor y el color del segmento
B1 <- s$xyz.convert(0,pH[2],0)
B2 <- s$xyz.convert(pH[1],pH[2],0)
segments(B1$x,B1$y,B2$x,B2$y, col = "lightblue")
C1 <- s$xyz.convert(pH[1],pH[2],0)
C2 <- s$xyz.convert(pH[1],pH[2],pH[3])
segments(C1$x,C1$y,C2$x,C2$y, col = "lightblue")
#vector pH
arrows2D(PV1$x,PV1$y,pHXYZ$x,pHXYZ$y,lwd = 2,col = "darkblue", add = T) #Con esta función se permite el trazado de una flecha en 2D, que junto con la conversión del sistema de coordenadas de pH permiten gráficar el vector

#Trazado de segmentos para la ubicación de las coordenadas del Vector Materia orgánica
PV1 <- s$xyz.convert(0,0,0) #Punto de origen en (0,0,0)
MO0 <- c(40,50,30)
MO <- MO0/10  #Los datos de contenido de materia orgánica estan en porcentaje divididos entre 10
MOXYZ <- s$xyz.convert(MO[1],MO[2],MO[3])
D1 <- s$xyz.convert(MO[1],0,0)
D2 <- s$xyz.convert(MO[1],MO[2],0)
segments(D1$x,D1$y,D2$x,D2$y, col = "lightgreen")
E1 <- s$xyz.convert(0,MO[2],0)
E2 <- s$xyz.convert(MO[1],MO[2],0)
segments(E1$x,E1$y,E2$x,E2$y, col = "lightgreen")
F1 <- s$xyz.convert(MO[1],MO[2],0)
F2 <- s$xyz.convert(MO[1],MO[2],MO[3])
segments(F1$x,F1$y,F2$x,F2$y, col = "lightgreen")
#vector MO
arrows2D(PV1$x,PV1$y,MOXYZ$x,MOXYZ$y,lwd = 2,col = "darkgreen", add = T) #Con esta función se permite el trazado de una flecha en 2D, que junto con la conversión del sistema de coordenadas de MO permiten gráficar el vector
#Cálculo del ángulo entre vectores  
uv <- pH%*%MO  
Modu <- pH[1]^2+pH[2]^2+pH[3]^2;Modu 
## [1] 171.34
Modv <- MO[1]^2+MO[2]^2+MO[3]^2;Modv
## [1] 50
Cosphi <- uv/(Modu*Modv)
Angulo <- acos(Cosphi)
Angulo*180/pi
##          [,1]
## [1,] 89.42817
#Leyenda, Con esta función es posible agregar un cuadro de texto (Leyenda), ubicándolo en una parte especifica de la gráfica.
legend("topleft", c("Vector pH: Azul","Vector MO: Verde",
                    "Angulo entre los vectores= 89,4°"),cex = 0.7)
legend("topright", c("pH=[4.5, 7.8, 9.5]","MO =[4, 5, 3]"),cex = 0.7)

#Correlación de Pearson
cor(MO,pH) 
## [1] -0.3343418