2012-08-05 3 views
1

this을 참조로 사용하면 더 낮은 48 개의지도를 플롯하고 상태 간 흐름을 시각화하기 위해 레이어를 추가하려고합니다. 나는이 문제를 디버깅하려고ggplot 맵에 지리 공간 연결을 추가하는 방법은 무엇입니까?

p 
Error in eval(expr, envir, enclos) : object 'lon' not found 

플롯을 인쇄하려고이

p + geom_line(data = list_lines[[1]], aes(x = lon, y = lat), color = '#FFFFFF') 

하지만 두 번째의 또 다른 레이어를 추가를 작동 발견했을 때 여기

library(ggplot2) 
library(maps) 
library(geosphere) # to inter-polate a given pair of (lat,long) on the globe 

# load map data for the US 
all_states <- map_data("state") 

# plot state map 
p <- ggplot() + geom_polygon(data=all_states, 
         aes(x=long, y=lat, group = group), 
         colour="white", fill="grey10") 

# sample origin - destination lat,long pairs 
geo <- structure(list(orig_lat = c(36.17, 36.17, 36.17), 
orig_lon = c(-119.7462, -119.7462, -119.7462), dest_lat = c(33.7712, 36.17, 39.0646), 
    dest_lon = c(-111.3877, -119.7462, -105.3272)), .Names = c("orig_lat", 
"orig_lon", "dest_lat", "dest_lon"), row.names = c(NA, 3L), class = "data.frame") 

#> geo 
# orig_lat orig_lon dest_lat dest_lon 
#1 36.17 -119.7462 33.7712 -111.3877 
#2 36.17 -119.7462 36.1700 -119.7462 
#3 36.17 -119.7462 39.0646 -105.3272 

# list to hold a dataframe of interpolated points for each origin-destination pair 
list_lines <- list() 

# use the geosphere package's gcIntermediate function to generate 50 interpolated 
# points for each origin-destination pair 
for (i in 1:3) { 
    inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
             c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
             n=50, addStartEnd=TRUE)) 
    list_lines[i] <- list(inter) 
    p <- p + geom_line(data = list_lines[[i]], aes(x = lon, y = lat), color = '#FFFFFF') 
} 
p 

내가 무엇을 얻을 list 엘리먼트는 그것을 깨뜨린 다. 그러나 그것은 내가 R과 ggplot에 대한 나의 제한된 지식으로 얻을 수있는 한도 내이다.

답변

3

gcIntermediate 수익률은 다른 열 이름 (출발지와 목적지 내가 동일합니다 이후 = 2) :

for (i in 1:3) { 
    inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
             c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
             n=50, addStartEnd=TRUE)) 
    print(head(inter, n=2)) 
} 
    lon lat 
1 -119.7 36.17 
2 -119.6 36.13 
     V1 V2 
1 -119.7 36.17 
2 -119.7 36.17 
    lon lat 
1 -119.7 36.17 
2 -119.5 36.24 

다음 줄은 작동합니다 :

for (i in 1:3) { 
    inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
             c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
             n=50, addStartEnd=TRUE)) 
    names(inter) <- c("lon", "lat") 
    p <- p + geom_line(data=inter, aes(x=lon, y=lat), color='#FFFFFF') 
} 
+0

! 그게 문제를 고쳤어, 고마워! – JConnor

1

나를 괴롭히는 것은 두 가지 방법으로 경도를 참조한다는 것입니다. 스크립트 시작 부분에 long, 끝 부분에 lon입니다. 여러 기하 구조가 함께 작동하기를 원하면이 이름을 일관되게 유지해야합니다.

또한 루프와 함께 동일한 기하 구조를 추가하는 것이 거의 필요하지 않습니다. 단일 geom_line을 추가하고 color 미학을 사용하여 여러 줄을 그립니다.

0

ggplot2를 사용하여 정말 간단한 해결책이있다 . ggplot2, here을 사용하여 R에 흐름 맵을 플로팅하는 방법에 대한 간단한 자습서가 있습니다. 나를 오히려 바보였다

p + 
    geom_segment(data = geo, aes(x = orig_lon, y = orig_lat, 
           xend = dest_lon, yend = dest_lat, 
           color="#FFFFFF")) + coord_equal() 

enter image description here

관련 문제