我正在使用arrows()
将一组点绘制成另一组点的箭头。我希望通过一个公共长度来缩短箭头,以避免与标签重叠。然而,鉴于arrows()
接受坐标作为输入,如何实现这一点并不明显。
例如,这是一个示例:
x <- stats::runif(12); y <- stats::rnorm(12)
i <- order(x, y); x <- x[i]; y <- y[i]
plot(x,y, main = "Stack Example", type = 'n')
text(x = x, y = y, LETTERS[1:length(x)], cex = 2, col = sample(colors(), 12))
s <- seq(length(x)-1) # one shorter than data
arrows(x[s], y[s], x[s+1], y[s+1])
如何缩短箭头以避免与标签重叠?
更新
这些都是非常好的答案。为了提供一种不假定点以链条连接的方法,我编写了以下函数,它将x0y0(一个数据框,其中第1列是x,第2列是y)移向xy(与x0y0格式相同),绝对距离为d。
movePoints <- function(x0y0, xy, d){
total.dist <- apply(cbind(x0y0, xy), 1,
function(x) stats::dist(rbind(x[1:2], x[3:4])))
p <- d / total.dist
p <- 1 - p
x0y0[,1] <- xy[,1] + p*(x0y0[,1] - xy[,1])
x0y0[,2] <- xy[,2] + p*(x0y0[,2] - xy[,2])
return(x0y0)
}
fields
包中的arrow.plot
。它有一个长度调整选项。 - Rich Scriven