线框图(格子包)中的负长度矢量是什么意思?

时间:2012-10-08 15:09:39

标签: r lattice

我想使用网格包在R中绘制线框。但是,我收到以下错误消息“不允许使用数据包1负长度向量的错误”。数据如下所示:

> result_mean
  experiment alpha beta   packet
1          0   1.0    1 3.000000
2          0   1.1    1 2.571429

创建数据的命令如下

  png(file=paste("foobar.png"),width=1280, height=1280);
    plot <- wireframe(result_mean$packet ~ result_mean$alpha * result_mean$beta,       
      data=result_mean, scales = list(arrows=FALSE, cex= .45, col = "black", font = 3),
      drape = TRUE, colorkey = TRUE, main = "Foo",
      col.regions = terrain.colors(100),
      screen = list(z = -60, x = -60),
      xlab="alpha", ylab="beta", zlab="mean \npackets");
  print(plot);
  dev.off();

我想知道这个错误信息意味着什么,以及是否有一个好的方法来调试它?

提前致谢!

1 个答案:

答案 0 :(得分:3)

调试点阵图形有点困难,因为(a)代码复杂且多层次,(b)错误陷入困境,难以拦截。但是,您至少可以在诊断问题中找到一些方法。

首先创建一个最小的例子。我怀疑你的问题是你的数据属于一行,所以我创建了类似的数据:

d <- data.frame(x=c(1,1.1),
                y=c(1,1),
                z=c(2,3))

library(lattice)
wireframe(z~y*x,data=d)

现在确认完全三维数据(定义平面的数据)工作正常:

d2 <- data.frame(expand.grid(x=c(1,1.1),
                             y=c(1,1.1)),
                 z=1:4)
wireframe(z~y*x,data=d2) 

所以问题是 - 你是否打算在一条线上绘制两个点的线框?如果是这样,你想在剧情中出现什么?你可以稍微破解一下,将y值设置为稍微不同 - 但我试过了,并没有出现线框(但也没有错误)。

修改:我进行了更多跟踪,包含各种debug()咒语(并搜索lattice包的源代码和R本身的内容)推断以下内容:在一个名为lattice:::panel.3dwire的函数中,调用C函数wireframePanelCalculations,您可以在https://r-forge.r-project.org/scm/viewvc.php/pkg/src/threeDplot.c?view=markup&root=lattice看到

在此功能中:

nh = (nx-1) * (ny-1) * ng; /* number of quadrilaterals */
sHeights = PROTECT(allocVector(REALSXP, nh));

在这种情况下nx为零,所以这段代码要求R分配一个负长度向量,这是错误的来源。

在这种情况下,我认为诊断比显式调试更有用。