在 R 中找到 ggplot/grid 的角度和距离

Finding the angle and distance over a ggplot/grid in R

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

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

现在从这些点,假设如图所示的A1和A2,我想测量每个点所覆盖的角度和距离。

我知道如何计算一个点的距离(通过欧氏距离公式),对于角度,它可以计算为向量的叉积和点积。但是我面临着对此进行编码和表示的问题。 你能帮忙吗?

好的,这是第一步 - 在 grid 中进行。我想这也可以在 ggplot2 中完成,但我现在想学习网格,因为 ggplot2 和 lattice 是基于它的。这个图有一些问题,例如注释文本的角度确实必须在设备坐标中计算,而不是本地坐标,所以只有当你的网格方块真的是正方形时它才会看起来正确。我可能会稍后修复它,但我现在没有时间。另外我想我可以指定默认值,这样每个基元就没有那个 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")
}

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

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