“零长度箭头”有多小?

时间:2018-10-07 15:20:06

标签: r plot

如果您经常使用arrows函数,则可能会遇到以下警告:

set.seed(438520)
N = 1000
x = rnorm(N, sd = .1)
y = rnorm(N)

png('~/Desktop/arrows.png', height = 240, width = 240)
plot(NA, xlim = c(-1, 1), ylim = c(-3, 3))
arrows(x[-N], y[-N], x[-1L], y[-1L])
dev.off()
  

警告信息:   在箭头(x [-N],y [-N],x [-1L],y [-1L])中:     零长箭头的角度不确定,因此被跳过

small arrow

我们如何确定哪些箭头有误,以便在我们认为合适的情况下进行处理?

1 个答案:

答案 0 :(得分:3)

答案由?arrows暗示:

  

长度为零的箭头的方向不确定,因此箭头的方向也不确定。为了避免出现舍入错误,长度小于1/1000英寸的任何箭头都将省略箭头(带有警告)。

当然会问一个问题-What is an inch?

该问答集中在一个相关的问题上,但是学习也可以在这里进行:

png('~/Desktop/arrows.png', height = 240, width = 240)
plot(NA, xlim = c(-1, 1), ylim = c(-3, 3))

# get each arrow's length by converting x and y coords to inches
units = par(c('usr', 'pin'))
x_to_inches = with(units, pin[1L]/diff(usr[1:2]))
y_to_inches = with(units, pin[2L]/diff(usr[3:4]))

dists = sqrt((x_to_inches * diff(x))**2 + (y_to_inches * diff(y))**2)

# which arrows are the culprits?
idx = which(dists < .001)

# option: remove the arrow base & head from the culprit pair(s)
arrows(x[-c(N, idx)], y[-c(N, idx)], 
       x[-c(1L, idx + 1L)], y[-c(1L, idx + 1L)])
dev.off()

您可以在R源代码中看到here,该方法几乎与最初用于生成此警告的方法相同(在C级别)。

这总是困扰我,但永远不足以坐下来将其散列出来。