Размещение наконечников стрелок в середине линий в 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)
}

person antetokounmpo    schedule 15.12.2018    source источник
comment
Приведите пример желаемого результата. Ваше текущее объяснение не ясно...   -  person Cyrus Mohammadian    schedule 15.12.2018
comment
может помочь: stackoverflow.com/questions/6893959/   -  person user20650    schedule 15.12.2018
comment
col = 1:3 не имеет смысла, потому что в каждом цикле рисуется только одна стрелка.   -  person Darren Tsai    schedule 16.12.2018
comment
@DarrenTsai да, я исправил это.   -  person antetokounmpo    schedule 16.12.2018


Ответы (2)


Создайте пользовательскую функцию 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(), за исключением того, что она имеет еще один новый аргумент 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)
}

введите здесь описание изображения

person Darren Tsai    schedule 15.12.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)

Стрелка в центре

person G5W    schedule 15.12.2018