Итак, вот первый проход - это делать в 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")
}
Не ясно, что вы хотите сделать. Вы хотите рассчитать их и разместить в сюжете согласно вашему рисунку? Я так думаю, но это не то, что вы говорите. –
@MikeWise Я думаю «... и представлять это». означает именно это. –
Может быть. Но я мог бы интерпретировать это иначе. Было бы легко ОП подтвердить это. Если это какой-то дидактический график геометрии, я думаю, что «сетка» может быть лучшей платформой, чем «ggplot» –