如何将 R 图形设备设置为二维 canvas?

How can I set up an R graphics device as a 2-d canvas?

如果我创建一个新的图形设备,用户坐标似乎定义了一个 (0,1) 正方形,但我无法做任何标记,因为 plot.new 尚未被调用:

> dev.new()
> par()$usr
[1] 0 1 0 1
> points(0.5, 0.5)
Error in plot.xy(xy.coords(x, y), type = type, ...) : 
  plot.new has not been called yet

有没有一种简单的方法可以将此图形设备转换为用户坐标为 (0,1),(0,1) 的可绘制对象 canvas?

我只是简单地尝试了 plot.new(),但这设置了一个不可见的空白图表,边距为 space。点 (0,0) 和 (1,1) 不在图形设备的角上。

我想我需要将一些边距参数设置为 c(0,0,0,0),但我不确定是哪些,也许还有更直接的方法。

最终结果应该是一个空白图形 window(或其他设备),这样 points(0,0) 在左下角产生一个点(或者准确地说,只是一个点符号的四分之一)和points(1,1) 在右上角产生四分之一的点。

解决方案似乎是将 mar 设置为零,并在设置绘图时为 xaxsyaxs 指定 "i"

> par(mar=c(0,0,0,0))
> x=0:1
> y=0:1
> plot(x,y, type="n", xaxs="i", yaxs="i")
> 
> points(1,1,pch=19,cex=4)
> 
> points(0,0,pch=19,cex=4)

没有设置 xaxsyaxs 有一个很小的余量:

默认“r”样式和“i”样式之间的区别是:

      Style ‘"r"’ (regular) first extends the data range by 4
      percent at each end and then finds an axis with pretty labels
      that fits within the extended range.
      Style ‘"i"’ (internal) just finds an axis with pretty labels
      that fits within the original data range.

这可能意味着这只适用于“漂亮”的精确边界,如 0 和 1,但如果我想要一个轴上恰好在 3.245 和 93.1 之间的坐标系,可能会失败......虽然我已经尝试过并且我认为“漂亮”的考虑纯粹是标签 - 轴限制是准确的。

par(mar = c(0, 0, 0, 0))
plot(NA, xlim=0:1, ylim=0:1, ann=FALSE, frame=FALSE,
     xaxt="n", yaxt="n", xaxs="i", yaxs="i")
    需要
  • xlim=ylim=,因为它不能根据数据自动判断范围;
  • ann=frame= 确保既不显示轴标签也不显示 box/frame;
  • xaxt=yaxt= 删除勾号;这可能有点多余,因为即使绘制它们也会在显示区域之外,但我想我会提到这一点,以防你使用 par(mar=..) 而不是全零;
  • xaxs=yaxs= 禁用 R 基本绘图引擎默认的 4% 扩展。