首页 文章

在R中找到ggplot /网格上的角度和距离

提问于
浏览
1

我使用了一些A和B数值制作了一个ggplot . (如果可能的话,你能给我一个网格解决方案吗?)如:

A   B
2   3
3   7
4   8
5   9
6   2
7   1

现在从点,让我们说A1和A2如图所示,我想测量每个点覆盖的角度和距离 .

我知道如何从一个点计算距离(通过欧几里德距离公式),对于角度,它可以计算为矢量的交叉和点积 . 但我面临的问题是编码并代表它 . 你能帮我吗?

enter image description here

2 回答

  • 1

    好的,这是第一遍 - 在 grid 中完成 . 这也可以在 ggplot2 中完成,我想,但我现在想学习网格,因为ggplot2和格基于它 . 这个图有一些问题,例如注释文本的角度实际上必须在设备坐标中计算,而不是原生坐标,所以只有你的网格方块确实是正方形时它才会看起来正确 . 我可能稍后会解决这个问题,但我没有 default.units 参数 . 这应该让你开始 .

    library(grid)
    
    grid.newpage()
    df <- data.frame(a=c(2,3,4,5,6,7),b=c(3,7,8,9,2,1))
    
    vp <- viewport(x=0.5,y=0.5,width=0.999,height=0.999,xscale=c(0,1),yscale=c(0,1))
    pushViewport(vp)
    
    # a rectangle (with dashed lines) on the border of the viewport:
    grid.rect(gp=gpar(lty="dashed",col="steelblue"))
    
    vp <- viewport(x=0.5,y=0.5,width=0.9,height=0.9,xscale=c(0,8),yscale=c(0,10),
                   default.units="native")
    pushViewport(vp)
    
    #draw the background grid
    grid.polyline(x=rep(0:8,each=2),y=rep(c(0,10),9),id=rep(1:9,each=2),
                  gp=gpar(lty="solid",col="gray"),default.units="native")
    grid.polyline(x=rep(c(0,8),11),y=rep(0:10,each=2),id=rep(1:11,each=2),
                  gp=gpar(lty="solid",col="gray"),default.units="native")
    
    # add the lables
    grid.text(as.character(0:8),x=0:8,y=rep(-0.2,9),
              gp=gpar(col="gray",fontsize=12),default.units="native")
    grid.text(as.character(0:10),y=0:10,x=rep(-0.2,11),
              gp=gpar(col="gray",fontsize=12),default.units="native")
    
    grid.lines(x=df$a,y=df$b,gp=gpar(col="steelblue"),default.units="native")
    grid.points(x=df$a,y=df$b,gp=gpar(col="steelblue"),default.units="native")
    
    
    for (i in 1:(nrow(df)-1)){
       x0 <- df$a[i]
       y0 <- df$b[i]
       x1 <- df$a[i+1]
       y1 <- df$b[i+1]
       dx <- x1-x0
       dy <- y1-y0
       dist <- sqrt( dx^2 + dy^2 )
       ang <- (180/3.14159)*atan2(dy,dx)
       txt <- sprintf("D: %.1f  Ang:%.1f",dist,ang)
       xt <- (x0+x1)/2
       yt <- (y0+y1)/2 + 0.2*abs(dy/dx)
       grid.text(txt,x=xt,y=yt,rot=ang,
                 gp=gpar(col="steelblue",fontsize=9),default.units="native")
    }
    

    enter image description here

  • 1

    计算那些角度和距离之外的距离听起来更容易,

    library(dplyr)
    d <- data.frame(x=c(2,3,4,5,6,7),
                    y=c(3,7,8,9,2,1))
    
    d2 <- with(d, data.frame(dx=diff(x), dy=diff(y)))
    d2 <- mutate(d2, distance = sqrt(dx^2 + dy^2), 
                 angle = atan2(dy, dx))
    
    ann <- mutate(cbind(d[-nrow(d),], d2), 
                  x=x+dx/2, y=y+dy/2, 
                  label = sprintf("%.2f\n %2.f degrees", 
                                  distance, angle*180/pi))
    
    library(ggplot2)
    ggplot(d, aes(x,y)) + geom_line() +
      geom_text(data = ann, vjust = 0,
                aes(x, y, label=label, angle=angle*180/pi)) +
      coord_equal()
    

    enter image description here

相关问题