Problema de colorear un diagrama de dispersión 3D usando "plot3D"

Dec 05 2020

Estoy tratando de crear un diagrama de dispersión 3D usando plot3Dpackage. Desafortunadamente, tengo problemas para asignar color a cada punto.

Por ejemplo, cuando trato de dibujar 8 puntos en la trama y quiero asignar "negro" a los primeros 4 puntos y "rojo" a los últimos 4 puntos respectivamente, he escrito el siguiente guión (en este guión, empleé 8 ejemplos de la muestra de datos irisy intentado asignar Sepal.Length, Petal.Length, Sepal.Widthpara X, y, eje Z, respectivamente);

data(iris)
sep.l <- iris[1:8,]$Sepal.Length pet.l <- iris[1:8,]$Petal.Length
sep.w <- iris[1:8,]$Sepal.Width


library(plot3D)
scatter3D(x=sep.l, y=pet.l, z=sep.w,
pch =19,
bty = "b2",
colkey= FALSE,
col=c(rep("black", 4), rep("red", 4)))

En este caso, curiosamente, 6 puntos fueron de color negro y 2 puntos fueron de color rojo, respectivamente. Estoy completamente perdido por qué sucede esto.

Le agradecería mucho si tuviera la amabilidad de dejarme saber cómo resolver este problema. ¡Muchas gracias por adelantado!

Respuestas

1 Ben Dec 06 2020 at 00:14

La razón por la que ves 6 negros y 2 rojos es que colvarfaltan en tu scatter3Dllamada para usarlos colen colorear.

En su ejemplo, el color se basa en su eje z. Para demostrarlo, podemos volver a agregar colkey, agregar ticktypepara ver la información del eje y rotar un poco para mostrar que el color rojo se aplica para valores superiores a 3.45 pulgadas sep.w(eje z), que solo incluye 2 valores de sus datos (3.6 y 3.9) .

data(iris)

sep.l <- iris[1:8,]$Sepal.Length pet.l <- iris[1:8,]$Petal.Length
sep.w <- iris[1:8,]$Sepal.Width

library(plot3D)

scatter3D(x = sep.l, y = pet.l, z = sep.w,
          pch = 19,
          bty = "b2",
          colkey = TRUE,
          phi = 15,
          theta = 30,
          col=c(rep("black", 4), rep("red", 4)),
          ticktype = "detailed"
          )

Ahora, si desea asignar colores según el índice / número de los 8 puntos, puede agregar colvary asignar, por ejemplo, los primeros 4 valores como 1 para el negro y los segundos 4 valores como 2 para el rojo:

scatter3D(x = sep.l, y = pet.l, z = sep.w,
          pch = 19,
          bty = "b2",
          colkey = FALSE,
          phi = 15,
          theta = 30,
          col=c(rep("black", 4), rep("red", 4)),
          ticktype = "detailed",
          colvar = c(rep(1, 4), rep(2, 4)))

Puede considerar otro vector colvarque tendría sentido para colorear sus puntos; solo asegúrese de que tenga la misma longitud que sus datos x, y y z.