Problema de colorir gráfico de dispersão 3D usando “plot3D”
Estou tentando criar um gráfico de dispersão 3D usando o plot3D
pacote. 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 iris
e tentou atribuir Sepal.Length
, Petal.Length
, Sepal.Width
para 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
O motivo pelo qual você vê 6 pretos e 2 vermelhos é que colvar
está faltando na sua scatter3D
chamada para ser usado col
nas cores.
Em seu exemplo, a cor é baseada em seu eixo z. Para demonstrar, podemos adicionar de volta o colkey
, adicionar ticktype
para 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 colvar
e 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 colvar
que faça sentido para colorir seus pontos; apenas certifique-se de que tem o mesmo comprimento que seus dados x, y e z.