2013-12-08 48 views
2

在使用scatterplot3d包中的函数scatterplot3d()时,grid=TRUE仅绘制了XY平面的网格。查看函数源代码只有X和Y组件。我想提请对YZ-和XZ-平面网格为好,如下面的图片:将yz-和xz网格添加到scatterplot3d

Goal

我已经搜查了图像的R的例子scatterplot3d图片包含有这些网格无济于事。我想过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) 
} 

而且我也尝试在这个代码块中以一致的方式添加到x和z来定义这些y项。

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功能的原代码: scatterplot3d function source code

回答

2

我创建了一个新的功能,即增加电网XY和/或YZ功能。这个论点网格现在,可以列表像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

您可以找到新功能的源代码,在此gist

下面的代码修改:

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