Problem z kolorowaniem wykresu rozrzutu 3D za pomocą „plot3D”

Dec 05 2020

Próbuję utworzyć wykres punktowy 3D za pomocą plot3Dpakietu. Niestety mam problem z przypisaniem koloru do poszczególnych punktów.

Na przykład, kiedy próbuję narysować 8 punktów na wykresie i chcę przypisać „czarny” odpowiednio do pierwszych 4 punktów i „czerwony” do ostatnich 4 punktów, napisałem następujący skrypt (w tym skrypcie zastosowałem 8 próbek z przykładowego zbioru danych irisi próbował przypisać Sepal.Length, odpowiednio Petal.Length, Sepal.Widthdo osi X, Y, Z);

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

W tym przypadku, o dziwo, 6 punktów było odpowiednio czarnych, a 2 czerwone. Nie wiem, dlaczego tak się dzieje.

Byłbym wdzięczny, gdybyś uprzejmie poinformował mnie, jak rozwiązać ten problem. Z góry bardzo dziękuję!

Odpowiedzi

1 Ben Dec 06 2020 at 00:14

Powodem, dla którego widzisz 6 czarnych i 2 czerwone, jest to, że colvarnie ma go w twoim scatter3Dznaku, który ma być użyty colw kolorowaniu.

W Twoim przykładzie kolor jest oparty na osi z. Aby zademonstrować, możemy dodać colkey, dodać, ticktypeaby zobaczyć informacje o osi, i trochę obrócić, aby pokazać, że czerwony kolor jest stosowany dla wartości powyżej 3,45 cala sep.w(oś z), co obejmuje tylko 2 wartości z twoich danych (3,6 i 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"
          )

Teraz, jeśli chcesz przypisać kolory na podstawie indeksu / liczby 8 punktów, możesz dodać colvari przypisać do, na przykład, pierwsze 4 wartości jako 1 dla czerni i 4 wartości jako 2 dla czerwieni:

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

Możesz rozważyć inny wektor, colvarktóry miałby sens przy kolorowaniu twoich punktów; po prostu upewnij się, że ma taką samą długość jak dane x, y i z.