线框图(格子包)中的负长度向量是啥意思?

Posted

技术标签:

【中文标题】线框图(格子包)中的负长度向量是啥意思?【英文标题】:What does negative length vectors in a wireframe plot (lattice package) means?线框图(格子包)中的负长度向量是什么意思? 【发布时间】:2012-10-08 15:09:39 【问题描述】:

我想使用 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) traceback() 可以帮助查明哪里出了问题,(2) 尝试将代码缩减为最简单的数据集并绘制会产生此错误的绘图,然后共享数据与我们一起使用dput 问题是,错误打印在图中,而不是在 R 会话中(我使用 source 命令执行脚本),所以 traceback() 根本没有提供任何信息。 一个小问题是,如果您指定data=result_mean(如您所愿),那么您可以将公式表示为packet~alpha*beta,这样更具可读性,并且在一般。 【参考方案1】:

调试点阵图形有点困难,因为 (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 分配一个负长度向量,这就是错误的来源。

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

【讨论】:

+1 非常好,关于 lattice 的错误捕获引入的困难非常重要。我从来没有把我的手指放在这一点上,但你是完全正确的。编写我自己的代码时要记住的一些事情。 嗯,我要绘制的数据有点不同。我正在进行一系列的复制实验。每个复制都有一个结果,我想计算结果的平均值并将其与其他实验的其他(平均值)值进行比较。 alpha、beta 值表示从实验到实验的参数设置,数据包值是我感兴趣的平均值。这个想法是分析这个值如何随着不同的参数设置演变。但是,(包含)结果的日志文件非常庞大,我想事先对其进行测试。 嗯,真正的问题是,像上面的二维示例这样的数据是否会在您的实际应用程序中发生,或者是否将数据减少到只有两个点,您是否会减少它有点奇怪@ 987654332@无法处理...

以上是关于线框图(格子包)中的负长度向量是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

你真的搞懂什么是线框图,什么是原型图了吗?

UI素材|响应式设计且可缩放的线框图套件

为快速设计绞尽脑汁?5款快速线框图工具为你雪中送炭

带有 2D 投影的 3D 线框图:空间组织和投影频率

十个完全免费的网页原型(线框图)工具

移动产品原型和线框图设计工具介绍