14

为什么 R 的基本绘图功能会这样做?我们必须使用pointsor lines,这需要特殊代码而不是使用type参数。

plot(1:10)
plot(10:1, add = TRUE)
Warning messages:
1: In plot.window(...) : "add" is not a graphical parameter
2: In plot.xy(xy, type, ...) : "add" is not a graphical parameter
3: In axis(side = side, at = at, labels = labels, ...) :

等等。

许多包提供(即“覆盖”)绘图的方法,并提供明显的绘图能力(obj,add = TRUE),只要obj是适当的类。(例如sp, raster, spatstat.)

有什么理由plot.default不已经?

编辑:这是在这里详细讨论的:

https://stat.ethz.ch/pipermail/r-devel/2008-March/048628.html

DM 在这里有效地回答了这个问题:

https://stat.ethz.ch/pipermail/r-devel/2008-March/048650.html

4

2 回答 2

16

因为plot.default没有add论据

> args(plot.default)
function (x, y = NULL, type = "p", xlim = NULL, ylim = NULL, 
    log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL, 
    ann = par("ann"), axes = TRUE, frame.plot = axes, panel.first = NULL, 
    panel.last = NULL, asp = NA, ...) 
NULL

那些其他函数不是覆盖plot而是提供它们自己的方法,这些方法确实有一个参数add,因为它们是这样编写的。points()就个人而言,在使用等方面长大后,lines()我发现它们并没有太多额外的工作,我会优先使用它们而不是plot带有add参数的方法,尽管我们已经在我贡献的包中编写了这两种方式。

至于为什么plot.default没有add论据?您必须询问 R Core,但我可以提出一些理由

  1. plot.default旨在在设备上生成整个绘图
  2. 已经有points()等等lines(),为什么要重复?
  3. plot.default是更简单的代码,无需处理代码add
  4. 向后兼容 S/S-Plus
于 2013-08-15T21:32:58.990 回答
15

如果add=TRUE未提供(并且您正在使用基本图形),则par(new=TRUE)在绘图调用之前使用。您将需要禁止 xlab、ylab 和其他可能干扰或覆盖现有注释的内容,我确实保留了 ylab 以说明为什么需要该警告。您还需要将 xlim 和 ylim 设置为相同。

 plot(1:10);par(new=TRUE)
 plot(10:1)

在此处输入图像描述

在查看了评论之后,我投票赞成@John 的观点,即一个新的plot调用可能会有一组不同的 xlim 和 ylim,更不用说覆盖边距中所有文本对象的可能性了。points并且lines没有能力重新计算地块区域的限制,因此它们可以“安全”使用plot.default

于 2013-08-15T21:33:43.237 回答