2012-04-26 1 views
3

나는 R 내 데이터 세트의 차원 산점도를 음모 rgl을 사용하는 R의 3d 산점도 plot3d - 각 데이터 포인트마다 다른 크기?

plot3d(x,y,z, col=test$color, size=4) 

를 사용하고 있고 rgl으로 size 인수는 하나 개의 크기를합니다.

데이터 포인트별로 다른 크기를 가질 수 있습니까? 아니면 다른 라이브러리에서 가능합니까? 간단한 해결책이 있습니까?

의견을 보내 주셔서 감사합니다.

+0

재현 가능한 예제를 가지고있는 것이 좋습니다. : (iris, plot3d (Sepal.Length, Sepal.Width, Petal.Length, col = Species)) –

+1

이것은 작동하지 않는 것 같습니다. iris $ num <-rownames 홍채)와 (홍채 plot3d (Sepal.Length, Sepal.Width, Petal.Length, COL = 종)) 라이브러리 (plyr) d_ply (.DATA = 홍채 .variables = "NUM" 크기 = x $ Petal.Width)}) –

답변

6

다음은 Etienne에서 제안한 동일한 줄을 따라 해결되었습니다. 핵심 아이디어는 플롯을 설정 한 다음 points3d()에 대한 별도의 호출을 사용하여 각 크기 클래스의 점을 그립니다.

# Break data.frame into a list of data.frames, each to be plotted 
# with points of a different size 
size <- as.numeric(cut(iris$Petal.Width, 7)) 
irisList <- split(iris, size) 

# Setup the plot 
with(iris, plot3d(Sepal.Length, Sepal.Width, Petal.Length, col=Species, size=0)) 

# Use a separate call to points3d() to plot points of each size 
for(i in seq_along(irisList)) { 
    with(irisList[[i]], points3d(Sepal.Length, Sepal.Width, 
           Petal.Length, col=Species, size=i)) 
} 

(FWIW, plot3d() 직접이 일을 얻을 수있는 방법이 없다는 것을 나타 않습니다. 문제는 plot3d() 포인트 크기를 설정하는 도우미 함수 material3d()를 사용하고 다음과 같이이다, material3d() 만 원 하나의 숫자 값을 취할 수 있습니다.)

material3d(size = 1:7) 
# Error in rgl.numeric(size) : size must be a single numeric value 
+0

대단히 감사합니다 Etienne (x) {points3d (x = x $ Sepal.Length, y = x $ Sepal.Width, z = x $ Petal.Length, size = Josh, 적어도 나는 이것으로 고생하는 유일한 사람이 아닌 것 같습니다. 다른 패키지가이 기능을 제공 할 수 있다면 매우 유용하다고 생각하기 때문에 누군가 알 수 있습니까? –

+1

흠. 해결 방법이 도움이되지 않습니까? 3D 플롯에서 어떤 기능이 필요합니까? 동적 그래픽 (예 : 마우스로 회전/크기 조절), 은선 제거, 조명 효과 등이 필요한 경우 'rgl'이 붙어 있습니다. 그렇지 않으면'scatterplot3d'와 같은 것을 시도 할 수 있습니다. rgl이 해 당 포인트 크기를 효율적으로 지정할 수 있도록 해킹/업데이트 될 수 있지만, 노력이 필요한 이유를 아는 것이 중요합니다. –

+0

늦은 답장을 보내 주셔서 감사합니다. 나는 크기를 적응시키기가 너무 복잡하기 때문에 포인트를 표시하기 위해 tet를 사용했다. 어쨌든 하나의 차원을 더 갖는 것이 좋았을 것입니다. 그러나 어쨌든 너무 많은 것이었을 것입니다 ... –

0

을 그냥 나중에 년에 걸쳐 경우 다른 사람 비틀 거림, 크기 인수 등으로 변수를 전달하기 위해 지금 완전하게 가능하다 with(test, plot3d(x,y,z, col=test$color, size=test$size)).

사실, 크기에 맞는 데이터에 대한 작업을 수행 할 수 있으며 작동 할 수도 있습니다. 나는 size = x/(max(x,na.rm=TRUE)-min(x,na.rm=TRUE))의 라인을 따라 어떤 것으로 기본적인 크기 비율을 만드는 데 성공했다.

material3d은 하나의 숫자 값만 허용하지만 사실은 with 문 내의 크기에 제공된 식 또는 변수를 미리 계산해야하기 때문에 material3d은 각 점에 대해 단일 크기 값만 표시해야합니다. 내가 1 시간 정도 지나서 여기에 게시 된 해결 방법을 보면서 불필요하다는 것을 깨닫기 시작한 이래로 머리가 아프다.