2015-07-15 2 views
1

Я сделал ggplot, используя некоторые числовые значения A и B. (Если возможно вы можете дать мне решение для сетки тоже?) Такие, как:Поиск угла и расстояния над ggplot/сеткой в ​​R

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

Теперь из точек, позволяет сказать, что А1 и А2, как показано на рисунке, я хочу, чтобы измерить угол и расстояние, пройденное из каждой точки.

Я знаю, как рассчитать расстояние (по формуле евклидова расстояния) от одной точки, а для угла его можно рассчитать как поперечное и точечное произведение векторов. Но я столкнулся с проблемой, чтобы закодировать это и представить его. Вы можете помочь?

enter image description here

+0

Не ясно, что вы хотите сделать. Вы хотите рассчитать их и разместить в сюжете согласно вашему рисунку? Я так думаю, но это не то, что вы говорите. –

+0

@MikeWise Я думаю «... и представлять это». означает именно это. –

+0

Может быть. Но я мог бы интерпретировать это иначе. Было бы легко ОП подтвердить это. Если это какой-то дидактический график геометрии, я думаю, что «сетка» может быть лучшей платформой, чем «ggplot» –

ответ

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

+0

большое спасибо Mike. – ayush

+0

@MikeWise вы можете дать аналогичный ответ, если моя сетка не квадратная? –

+0

Измерение и расчет углов действительно имеют смысл только в том случае, если сетка квадратная или, точнее, если базовые измерения являются инвариантными относительно вращения. Подумайте об этом ... –

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

+0

У меня возникла проблема с настройкой текста в сюжете. Он выглядит таким же, когда я использую этот набор данных. Но когда я использую свой исходный набор данных, текст -ve-axis по оси x появляется вверху вниз и довольно далеко от базовой линии. –

+1

сделайте себе одолжение и опубликуйте полностью воспроизводимый минимальный пример вашей проблемы. В противном случае мы просто стреляем в темноту, каждый раз. – baptiste

Смежные вопросы