Problème de coloration du nuage de points 3D avec "plot3D"

Dec 05 2020

J'essaie de créer un nuage de points 3D en utilisant un plot3Dpackage. Malheureusement, j'ai du mal à attribuer une couleur à chaque point.

Par exemple, lorsque j'essaie de dessiner 8 points sur l'intrigue et que je veux attribuer respectivement «noir» aux 4 premiers points et «rouge» aux 4 derniers points, j'ai écrit le script suivant (dans ce script, j'ai utilisé 8 exemples à partir de l'ensemble de données échantillon iriset essayé d'assigner Sepal.Length, Petal.Length, Sepal.WidthX, Y, axe Z, respectivement);

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)))

Dans ce cas, curieusement, 6 points étaient respectivement de couleur noire et 2 points de couleur rouge. Je ne sais pas pourquoi cela se produit.

J'apprécierais beaucoup si vous me fassiez savoir comment résoudre ce problème. Merci beaucoup d'avance!

Réponses

1 Ben Dec 06 2020 at 00:14

La raison pour laquelle vous voyez 6 noirs et 2 rouges, c'est qu'il colvarmanque à votre scatter3Dappel pour être utilisé avec la colcoloration.

Dans votre exemple, la couleur est basée sur votre axe z. Pour démontrer, nous pouvons rajouter colkey, ajouter ticktypepour voir les informations d'axe et faire pivoter un peu pour montrer que la couleur rouge est appliquée pour les valeurs supérieures à 3,45 pouces sep.w(axe z), qui ne comprend que 2 valeurs de vos données (3,6 et 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"
          )

Maintenant, si vous souhaitez attribuer des couleurs en fonction de l'index / numéro des 8 points, vous pouvez ajouter colvaret attribuer, par exemple, les 4 premières valeurs comme 1 pour le noir et les 4 secondes comme 2 pour le rouge:

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)))

Vous pouvez envisager un autre vecteur car colvarcela aurait du sens pour colorer vos points; assurez-vous simplement qu'elle est de la même longueur que vos données x, y et z.