2013-12-08 2 views
2

scatterplot3d 패키지의 scatterplot3d() 함수를 사용할 때 grid=TRUE은 XY 평면에 대해서만 격자를 표시합니다. 함수 소스 코드를 보면 X 및 Y 구성 요소 만 있습니다. 나는 그림에서 아래뿐만 아니라 YZ- 및 XZ- 평면의 격자를 그리려 :scatterplot3d에 yz- 및 xz-grid 추가

Goal

나는 아무 소용이 격자 이미지를 scatterplot3d R의 예제 이미지를 검색했다. 나는 s3d$plane3d에 대해 생각했지만 생성 된 비행기는 매우 엉망으로 보인다.

R에서 코드 편집 또는 쓰기 기능을 사용 해본 경험이 없습니다. xy.grid, yz.grid 및 xz.grid 인수를 추가하고 다음과 같이 격자에 대한 원래 정의를 수정할 수 있다고 생각했습니다.

if (xy.grid) { 
    i <- x.min:x.max 
    segments(i, z.min, i + (yx.f * y.max), yz.f * y.max + 
       z.min, col = col.grid, lty = lty.grid) 
    i <- 0:y.max 
    segments(x.min + (i * yx.f), i * yz.f + z.min, x.max + 
       (i * yx.f), i * yz.f + z.min, col = col.grid, lty = lty.grid) 
} 


if (xz.grid) { 
    i <- x.min:x.max 
    segments(i, y.min, i + (zx.f * z.max), zy.f * z.max + 
       y.min, col = col.grid, lty = lty.grid) 
    i <- 0:z.max 
    segments(x.min + (i * zx.f), i * zy.f + y.min, x.max + 
       (i * zx.f), i * zy.f + y.min, col = col.grid, lty = lty.grid) 
} 
if (yz.grid) { 
    i <- y.min:y.max 
    segments(i, x.min, i + (yz.f * z.max), zx.f * z.max + 
       x.min, col = col.grid, lty = lty.grid) 
    i <- 0:z.max 
    segments(y.min + (i * yz.f), i * zx.f + x.min, y.max + 
       (i * yz.f), i * zx.f + x.min, col = col.grid, lty = lty.grid) 
} 

그리고이 y 블록을 정의하기 위해 x와 z에 합치적인 방식으로이 코드 블록을 추가하려고합니다.

y.range <- range(dat$y[is.finite(dat$y)], ylim) 
    y.prty <- pretty(y.range, n = lab[1], min.n = max(1, min(0.5 * 
                   lab[1], p.lab[1]))) 
    y.scal <- round(diff(y.prty[1:2]), digits = 12) 
    dat$y <- dat$y/y.scal 
    y.range <- range(y.prty)/y.scal 
    y.max <- ceiling(y.range[2]) 
    y.min <- floor(y.range[1]) 
    if (!is.null(ylim)) { 
     y.max <- max(y.max, ceiling(ylim[2]/y.scal)) 
     y.min <- min(y.min, floor(ylim[1]/y.scal)) 
    } 
    y.range <- range(y.min, y.max) 

그러나이 새로운 코드를 실행하면 Error in segments(i, y.min, i + (zx.f * z.max), zy.f * z.max + y.min, : object 'zx.f' not found과 같은 오류가 발생합니다. 이 용어가 어떻게 그리고 어디에서 기능 코드에 정의되어 있는지 나는 잘 모르겠습니다. 덕분에 올바른 방향으로 인도하는 데 도움이 될 것입니다. scatterplot3d function source code

답변

2

나는 새로운 함수를 생성 및/또는 YZ 기능을 XY면 그리드를 추가

는 또한 여기에 scatterplot3d 기능에 대한 원래의 코드를 부착했다. 인수 그리드는 지금이 gist에, 당신은 새로운 기능의 소스 코드를 찾을 수 있습니다 grid=c('xy','yz')

z <- seq(-10, 10, 0.01) 
x <- cos(z) 
y <- sin(z) 
sactter.grid(x, y, z, highlight.3d=TRUE, 
       col.axis="blue", 
       grid=c('xy','xz','yz'), ## add grid to all facets 
      col.grid="lightblue") 

enter image description here

같은 목록을 취할 수 있습니다. 여기에 코드

수정 :

if ("xy" %in% grid || grid) { 
     i <- x.min:x.max 
     segments(i, z.min, i + (yx.f * y.max), yz.f * y.max + 
          z.min, col = col.grid, lty = lty.grid) 
     i <- 0:y.max 
     segments(x.min + (i * yx.f), i * yz.f + z.min, x.max + 
          (i * yx.f), i * yz.f + z.min, col = col.grid, lty = lty.grid) 
    } 
    if ("xz" %in% grid) { 
     i <- x.min:x.max 
     segments(i + (yx.f * y.max), yz.f * y.max + z.min, 
         i + (yx.f * y.max), yz.f * y.max + z.max, 
         col = col.grid, lty = lty.grid) 
     temp <- yx.f * y.max 
     temp1 <- yz.f * y.max 
     i <- z.min:z.max 
     segments(x.min + temp,temp1 + i, 
         x.max + temp,temp1 + i , col = col.grid, lty = lty.grid) 

    } 

    if ("yz" %in% grid) { 
     i <- 0:y.max 
     segments(x.min + (i * yx.f), i * yz.f + z.min, 
         x.min + (i * yx.f) ,i * yz.f + z.max, 
         col = col.grid, lty = lty.grid) 
     temp <- yx.f * y.max 
     temp1 <- yz.f * y.max 
     i <- z.min:z.max 
     segments(x.min + temp,temp1 + i, 
         x.min, i , col = col.grid, lty = lty.grid) 



    } 
+1

는 당신의 도움을 주셔서 감사합니다! 나는 내일 밤 해결책을 연구 할 것이다. – shirleywu

+0

@shirleywu 당신은 오신 것을 환영합니다. – agstudy

+0

방금 ​​나는 최고의 대답이 자동으로 현상금을 수여하지 않는다는 것을 깨달았습니다, 미안 해요! 그리고 다시 한 번 감사드립니다! – shirleywu