将箭头放在R中线的中间

Placing arrow heads to the middle of the lines in R

我有一个情节,我在其中绘制点与点之间的箭头。我不想把这个箭头放在行尾,而是放在中间。除了在相应行的一半长度上放置额外的箭头之外,是否有一种简单的方法可以做到这一点? 我的代码是这样的:

plot(x, y, xlim=range(x), ylim=range(y), xlab="x", ylab="y", pch=16,
     main="Filled Plane")

for(i in 1:20){
  arrows(x[i], y[i], x[i+1], y[i+1], length = 0.25, angle = 30, col = i)
}

由于你没有提供你的x和y,我补了一些数据。不需要循环。 arrows 将处理坐标向量。一种方法是绘制一个没有箭头的全长箭头,另一种方法刚好画到一半但有箭头。

## Some bogus data
set.seed(123)
x = runif(4)
y = runif(4)

## Compute the midpoints
midx = diff(x)/2 + x[-length(x)]
midy = diff(y)/2 + y[-length(y)]

## Draw it
plot(x,y,xlim=range(x), ylim=range(y), xlab="x", ylab="y", 
    main="Filled Plane",pch=16)
arrows(x[-length(x)], y[-length(y)],x[-1],y[-1],
    angle = 0, col = 1:3)
arrows(x[-length(x)], y[-length(y)],midx,midy,
    length = 0.25, angle = 30, col = 1:3)

创建一个自定义函数myArrow()并添加一个新参数cut来控制箭头的比例

myArrow <- function(x0, y0, x1, y1, cut = 1, ...){
  x.new <- (1 - cut) * x0 + cut * x1
  y.new <- (1 - cut) * y0 + cut * y1
  # segments(x0, y0, x1, y1, ...)
  arrows(x0, y0, x.new, y.new, ...)
}

Note1 :这个自定义函数中x.newy.new的计算使用了一个简单的数学概念,即截面公式cut的值必须在0到1之间.

注2 :除了多了一个新的参数cut之外,这个函数的用法等同于原来的函数arrows()

注3:如果你想要箭头后面的完整行,只需删除函数中的哈希(#)即可。


绘制并尝试不同的 cut 值。例如,我使用 cut = 0.7。 (如果你想让箭头在中间,使用 cut = 0.5。)

# Toy Data
x <- seq(1, 5.5, by = 0.5)
y <- rep(c(1, 5), 5)

plot(x, y, pch = 16)
for(i in 1:9){
  myArrow(x[i], y[i], x[i+1], y[i+1], cut = 0.7, col = i, lwd = 2)
}