Размещение наконечников стрел до середины линий в R - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть сюжет, где я рисую стрелки из точек в точки.Я хотел бы поместить эти наконечники стрел не в конец линии, а в середину.Есть ли простой способ сделать это, кроме размещения дополнительных стрелок с половиной длины соответствующей линии?Мой код такой:

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)
}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Создайте пользовательскую функцию 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, ...)
}

Примечание 1: Вычисление x.new и y.new в этой пользовательской функции используется простая математическая концепция, то есть Формула раздела .Значение cut должно быть в диапазоне от 0 до 1 .

Примечание 2: Использование этой функции эквивалентно использованию исходной функции arrows() otherкроме этого у него есть еще один новый аргумент cut.

Примечание 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)
}

enter image description here

0 голосов
/ 15 декабря 2018

Поскольку вы не предоставляете свои 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)

Arrowhead in center

...