Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:我怎样画一条有多个箭头的线?_R_Plot - Fatal编程技术网

R:我怎样画一条有多个箭头的线?

R:我怎样画一条有多个箭头的线?,r,plot,R,Plot,我想知道是否有人能帮我在R中画出带有多个箭头的线条,比如: --->--->--->---> 提前谢谢 正如乔兰所说,箭头 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]) 如果要绘制指定长度相等的直多箭头曲线,请使用以下功能: multarro

我想知道是否有人能帮我在R中画出带有多个箭头的线条,比如:

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


提前谢谢

正如乔兰所说,
箭头

 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)

multarrowsSimulair 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],...)
  }
}


真正棘手的部分是让箭头指向点的边缘而不是中心。需要吗?

根据对原始问题的澄清,我认为应该考虑一个一般性的答案

  • 计算由(x,y)点指定的断裂曲线的总长度

  • 将中间段分开,以确保箭头之间的曲线长度相等

  • 注意一些小细节,如初始“阶段”、终点、箭头后面是否应该有一个小空间等

下面是一个粗略的尝试

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)

arrowLine有一种不需要绘制一组线段或箭头的方法可以实现这一点。
从上面的
x
y
数据开始:

plot(x, y, t='l')
然后使用一些固定的例程计算从
x[1]
y[1]
x[2]
y[2]
等的局部坡度。将坡度转换为角度(以度为单位),然后(调用坡度向量
angslopes

抱歉,这不起作用,因为据我所知,
srt
必须是单个值。因此:

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

diflen我想我应该在这里添加一个基本的R解,将箭头计算为段。有多个版本可用于创建新绘图或向现有绘图添加箭头。较长的段分为较短的段:


添加箭头
箭头
p.箭头
箭头
都会浮现在脑海中。只有
arrows
在base R中,我想不起其他的包,但是谷歌应该很容易找到。这实际上只是画了多个箭头。我希望有一个选项,让你只画一条线与多个箭头在它…谢谢!你的第二个解决方案部分解决了这个问题。但问题是我画了多条不同长度的线,所以使用它可以在箭头之间创建具有不同间距的线,如下所示:。我将尝试找出如何解决这个问题,但我在R方面没有太多经验…第一个解决方案和第二个解决方案的组合应该表明这是可能的。您只需要提供线段的起点和终点,而不是在hte函数中拆分线段。数据!我们需要数据!(多次尝试加载链接图像失败。)谢谢!这在一定程度上起到了作用。但问题是,我画了多条不同长度的线,因此使用它可以在箭头之间创建具有不同间距的线,如下图所示:@David从我当时过于仓促的笔记中可以回忆到,
mang
angslopes
相同。很抱歉
text(x, y, labels=">", srt=angslopes)  # throws error
diflen <- length(x)-1
sapply(1:diflen, function(xind) text(x[xind+1], y[xind+1], labels='>', cex=2.5, srt=angslopes[xind]))

plot_arrows <- function(x, y, ...)
{
  plot(x, y, col = "white", ...)
  add_arrows(x, y, ...)
}
set.seed(69)

x <- 1:10
y <- sample(10)
plot(x, y)
add_arrows(x, y)