我使用了一些A和B数值制作了一个ggplot . (如果可能的话,你能给我一个网格解决方案吗?)如:
A B 2 3 3 7 4 8 5 9 6 2 7 1
现在从点,让我们说A1和A2如图所示,我想测量每个点覆盖的角度和距离 .
我知道如何从一个点计算距离(通过欧几里德距离公式),对于角度,它可以计算为矢量的交叉和点积 . 但我面临的问题是编码并代表它 . 你能帮我吗?
好的,这是第一遍 - 在 grid 中完成 . 这也可以在 ggplot2 中完成,我想,但我现在想学习网格,因为ggplot2和格基于它 . 这个图有一些问题,例如注释文本的角度实际上必须在设备坐标中计算,而不是原生坐标,所以只有你的网格方块确实是正方形时它才会看起来正确 . 我可能稍后会解决这个问题,但我没有 default.units 参数 . 这应该让你开始 .
grid
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") }
计算那些角度和距离之外的距离听起来更容易,
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()
2 回答
好的,这是第一遍 - 在
grid
中完成 . 这也可以在ggplot2
中完成,我想,但我现在想学习网格,因为ggplot2和格基于它 . 这个图有一些问题,例如注释文本的角度实际上必须在设备坐标中计算,而不是原生坐标,所以只有你的网格方块确实是正方形时它才会看起来正确 . 我可能稍后会解决这个问题,但我没有default.units
参数 . 这应该让你开始 .计算那些角度和距离之外的距离听起来更容易,