Masalah mewarnai sebar 3D menggunakan "plot3D"

Dec 05 2020

Saya mencoba membuat plot pencar 3D menggunakan plot3Dpaket. Sayangnya saya kesulitan dalam memberikan warna pada setiap poin.

Misalnya, ketika saya mencoba menggambar 8 poin pada plot dan saya ingin menetapkan "hitam" untuk 4 poin pertama dan "merah" untuk 4 poin terakhir, saya telah menulis skrip berikut (dalam skrip ini, saya menggunakan 8 sampel dari kumpulan data sampel irisdan mencoba untuk menetapkan Sepal.Length, Petal.Length, Sepal.Widthuntuk X, Y, Z sumbu, masing-masing);

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

Dalam kasus ini, anehnya, 6 titik diwarnai hitam dan 2 titik diwarnai merah. Saya benar-benar bingung mengapa ini terjadi.

Saya akan sangat menghargai jika Anda dengan baik hati memberi tahu saya cara mengatasi masalah ini. Terima kasih banyak sebelumnya!

Jawaban

1 Ben Dec 06 2020 at 00:14

Alasan Anda melihat 6 hitam dan 2 merah, adalah yang colvarhilang dari scatter3Dpanggilan Anda untuk digunakan coldalam pewarnaan.

Dalam contoh Anda, warna didasarkan pada sumbu z Anda. Untuk mendemonstrasikan, kita dapat menambahkan kembali colkey, menambahkan ticktypeuntuk melihat informasi sumbu, dan memutar sedikit untuk menunjukkan warna merah diterapkan untuk nilai lebih dari 3,45 dalam sep.w(sumbu z), yang hanya mencakup 2 nilai dari data Anda (3,6 dan 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"
          )

Sekarang, jika Anda ingin menetapkan warna berdasarkan indeks / angka dari 8 poin, Anda dapat menambahkan colvardan menetapkan, misalnya, 4 nilai pertama sebagai 1 untuk hitam dan 4 nilai kedua sebagai 2 untuk merah:

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

Anda dapat mempertimbangkan vektor lain colvaryang akan masuk akal untuk mewarnai poin Anda; pastikan panjangnya sama dengan data x, y, dan z Anda.