Problema de colorir gráfico de dispersão 3D usando “plot3D”

Dec 05 2020

Estou tentando criar um gráfico de dispersão 3D usando o plot3Dpacote. Infelizmente, tenho dificuldade em atribuir cor a cada um dos pontos.

Por exemplo, quando tento desenhar 8 pontos no gráfico e quero atribuir "preto" aos primeiros 4 pontos e "vermelho" aos últimos 4 pontos respectivamente, escrevi o seguinte script (neste script, empreguei 8 amostras a partir do conjunto de dados de amostra irise tentou atribuir Sepal.Length, Petal.Length, Sepal.Widthpara X, Y, eixo 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)))

Neste caso, estranhamente, 6 pontos foram coloridos de preto e 2 pontos foram coloridos de vermelho, respectivamente. Estou completamente perdido por que isso acontece.

Eu agradeceria muito se você gentilmente me dissesse como resolver este problema. Muito obrigado antecipadamente!

Respostas

1 Ben Dec 06 2020 at 00:14

O motivo pelo qual você vê 6 pretos e 2 vermelhos é que colvarestá faltando na sua scatter3Dchamada para ser usado colnas cores.

Em seu exemplo, a cor é baseada em seu eixo z. Para demonstrar, podemos adicionar de volta o colkey, adicionar ticktypepara ver as informações do eixo e girar um pouco para mostrar que a cor vermelha é aplicada a valores acima de 3,45 pol sep.w(eixo z), que inclui apenas 2 valores de seus dados (3,6 e 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"
          )

Agora, se você deseja atribuir cores com base no índice / número dos 8 pontos, você pode adicionar colvare atribuir, por exemplo, os primeiros 4 valores como 1 para preto e os segundos 4 valores como 2 para vermelho:

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

Você pode considerar outro vetor para colvarque faça sentido para colorir seus pontos; apenas certifique-se de que tem o mesmo comprimento que seus dados x, y e z.