R: как я могу нарисовать линию с несколькими стрелками в нем? - PullRequest
3 голосов
/ 01 августа 2011

Мне было интересно, может ли кто-нибудь помочь мне построить линии в R с несколькими стрелками на них, например:

---> ---> ---> --->

Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 02 августа 2011

Основываясь на пояснениях к исходному вопросу, я думаю, что общий ответ должен учитывать

  • вычисление общей длины ломаной кривой, указанной точками (x, y)

  • разделение промежуточных сегментов так, чтобы обеспечить одинаковую криволинейную длину между наконечниками стрел

  • позаботиться о мелких деталях, таких как начальная "фаза", конечная точка, следует ли за стрелками стрелок тонкий пробел и т. Д.

arrows

Ниже приведен грубый удар по нему.

arrowLine <- function(x, y, N=10, ...){
  lengths <- c(0, sqrt(diff(x)^2 + diff(y)^2))
  l <- cumsum(lengths)
  tl <- l[length(l)]
  el <- seq(0, to=tl, length=N+1)[-1]

  plot(x, y, t="l", ...)

  for(ii in el){

    int <- findInterval(ii, l)
    xx <- x[int:(int+1)]
    yy <- y[int:(int+1)]

    ## points(xx,yy, col="grey", cex=0.5)

    dx <- diff(xx)
    dy <- diff(yy)
    new.length <- ii - l[int]
    segment.length <- lengths[int+1]

    ratio <- new.length / segment.length

    xend <- x[int] + ratio * dx
    yend <- y[int] + ratio * dy
    points(xend,yend, col="white", pch=19)
    arrows(x[int], y[int], xend, yend, length=0.1)

}

}

set.seed(123)
x = sort(c(0, runif(200, 0,2* pi), 2*pi))
y=sin(x)

arrowLine(x, y, N=20)
3 голосов
/ 08 августа 2011

Есть хитрый способ сделать это без необходимости рисовать несколько отрезков или стрелок.
Начните с x и y данных, как указано выше:

plot(x, y, t='l')

Затем вычислите локальные наклоны от x[1], y[1] до x[2], y[2] и т. Д., Используя некоторую стандартную процедуру. Преобразовать уклоны в углы в градусах, а затем (вызывая вектор уклонов angslopes)

text(x, y, labels=">", srt=angslopes)  # throws error

Извините, это не сработает, потому что, насколько я могу судить, srt должно быть одним значением. Итак:

diflen <- length(x)-1
sapply(1:diflen, function(xind) text(x[xind+1], y[xind+1], labels='>', cex=2.5, srt=angslopes[xind]))

В пакете с решеткой может быть гораздо более простой способ сделать это.

Этот подход имеет косметическое преимущество: он позволяет указывать размер стрелки через par(cex), а также цвет, который может отличаться от цвета линии или даже изменяться по кривой.

2 голосов
/ 01 августа 2011

Simulair to DWin. Вот что я придумал:

arrowLine <- function(x0,y0,x1,y1,nArrow=1,...)
{
  lines(c(x0,x1),c(y0,y1),...)
  Ax=seq(x0,x1,length=nArrow+1)
    Ay=seq(y0,y1,length=nArrow+1)
  for (i in 1:nArrow)
  {
    arrows(Ax[i],Ay[i],Ax[i+1],Ay[i+1],...)
  }
}

По сути, это перекрывает несколько стрелок в строке, но дает желаемый результат (я полагаю, прямые линии):

plot(0:1,0:1)
arrowLine(0,0,1,1,4)

Multiple arrows on a line

Реальная хитрость заключается в том, чтобы получить стрелку, чтобы получить край точек вместо центра.Это нужно?

2 голосов
/ 01 августа 2011

Как говорит Джоран, arrows

 x=cos( seq(0, pi, by=pi/8)  )
 y=sin( seq(0, pi, by=pi/8))
 plot(1,1, ylim=range(y), xlim=range(x))
 arrows(x[-length(x)],y[-length(y)], x[-1],y[-1])

Если вы хотите нарисовать прямую кривую с несколькими стрелками с указанием равных длин, используйте эту функцию:

multarrows <- function(x0,y0, x1,y1,n_arr, ...) {x<- seq(x0,x1, length=n_arr+1)
             y<-seq(y0,y1, length=n_arr+1)
             arrows(x[-length(x)],y[-length(y)], x[-1],y[-1], ...) }
plot(0,0, xlim=c(0,2), ylim=c(0,11)); multarrows(0,0, 1,10, 10)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...