2013-07-03 3 views
0

Мне нужно сделать 2D-график пройденного расстояния по сравнению с моим значением в этой точке («интенсивность»).Данные XYZ для 2D-графика в R

Мои данные в формате:

lon lat intensity 

1. -85.01478 37.99030 -68.3167 
2. -85.00752 37.97601 -68.0247 
3. -85.00027 37.96172 -67.9565 
4. -84.99302 37.94743 -67.8917 

и продолжается 282 строк, как это. Я смотрел несколько пакетов, которые вычисляют расстояние между долготами (лон) и широтами (лат) (например, геосфера), но я не мог понять, как получить мои данные в том формате, который он хотел. Я знаю, что общее расстояние, пройденное в градусах, должно быть 4.01538, равномерно распределенное между 282 точками, но я не знаю, как я мог бы сделать столбец в R с учетом этого.

+1

Чтобы получить расстояние, вам нужно два очка; как вы соединяете данные, чтобы построить расстояние? – DiscreteCircle

+0

@DiscreteCircle Я считаю, что это путешествие и пункты заказаны. Поэтому Op просит расстояние между первой и второй точками, второй и третьей, ... – agstudy

ответ

1
dfrm$dist<- cumsum(c(0, with(dfrm, sqrt((lat[-1]-lat[-nrow(dfrm)])^2+ 
            (lon[-1]-lon[-nrow(dfrm)])^2 
           ))) ) 
with(dfrm, plot(dist, intensity, type="b")) 

enter image description here

Или выбрать более "географический" меру расстояния с лагом значениями столбцов. Но, учитывая приращения, я сомневаюсь, что ошибка использования наивной меры расстояния может быть такой.

+0

Большое вам спасибо! Это сработало отлично. Я просто изучаю R сейчас и застрял на этом в течение 2 дней. Теперь, чтобы просмотреть все команды, которые вы использовали, чтобы увидеть, как это работает ... – Riebeckite

+0

Функция 'with' немного выше уровня. Это позволяет вам пропустить запись имени dataframe несколько раз как 'dfrm $ ...'. Fn: 'cumsum' должен быть достаточно понятным, как и должна быть арифметика при вычислении длины гипотенузы правого треугольника. Я полагаю, что я мог бы создать промежуточную переменную расстояния промежутка, а затем использовать 'cumsum' на ней, но через некоторое время вы покидаете мышление Excel и не хотите возвращаться назад. –

1

От here Я нашел несколько пакетов для расчета расстояния между координатами. Предполагая, что ваши данные называют dtf и используя RSEIS пакет:

dtf <- data.frame(rbind(c(-85.01478,37.99030,-68.3167), 
c(-85.00752,37.97601,-68.0247),c(-85.00027,37.96172,-67.9565), 
c(-84.99302,37.94743,-67.8917))) 
names(dtf) <- c('lon','lat','int') 

library(RSEIS) 
travelint <- function(i,data){ 
ddeg <- GreatDist(dtf$lon[i],dtf$lat[i],dtf$lon[i+1],dtf$lat[i+1])$ddeg; 
dint <- dtf$int[i+1] - dtf$int[i]; return(list(ddeg,dint))} 
out <- sapply(1:(nrow(dtf)-1),data=dtf,travelint) 
out <- data.frame(matrix(as.numeric(out),ncol=2,byrow=T)) 
out$X1 <- cumsum(out$X1) 

Это ваши данные, рассчитать расстояние между точками и изменениями интенсивности между ними. После того, что она может быть построена следующим образом:

ggplot(out,aes(X1,X2)) + geom_line() + 
     labs(x="Distance (Degrees)",y="Intensity Change") 

enter image description here

Если вместо этого вы хотите, увеличивая интенсивность, вы можете использовать cumsum снова, чтобы получить кумулятивное изменение интенсивности, а затем добавить его к первой интенсивности:

out2 <- out 
out2 <- rbind(c(0,0),out2) 
out2$X2 <- cumsum(out2$X2) + dtf$int[1] 
ggplot(out2,aes(X1,X2)) + geom_line() + 
     labs(x="Distance (Degrees)",y="Intensity") 

enter image description here

0

Как упомянуто Dwin вы можете использовать наивную меру или географический д меры. Здесь я использую функцию gdist из пакета Imap, вычисляет расстояние по большому кругу.

library(Imap) 
library(lattice) 
#Dummy data 
longlat <- read.table(text="lon lat intensity 
1. -85.01478 37.99030 -68.3167 
2. -85.00752 37.97601 -68.0247 
3. -85.00027 37.96172 -67.9565 
4. -84.99302 37.94743 -67.8917", header=TRUE) 

ll <- lapply(seq(nrow(longlat)-1), function(x){ 
    start <- longlat[x,] 
    end <- longlat[x+1,] 
    cbind(distance = gdist(start$lon, start$lat, end$lon, end$lat,units = "m"), 
      intensity = end$intensity - start$intensity) 
    }) 
dd <- as.data.frame(do.call(rbind,ll)) 
library(lattice) 
xyplot(intensity~distance,dd,type= c('p','l'),pch=20,cex=2) 

enter image description here

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