2017-06-14 41 views
0

我想繪製使用傳單的線條,但是我在分隔段時遇到了一些困難。我有一個對象,看起來像這樣傳單單獨行

> head(trips, n=15) 
    time.start time.end long.start long.end lat.start lat.end distance time.diff  speed color 
1 1476450598 1476450713 9.03913 9.03924 45.61335 45.61362 31.25292  115 0.9783524 green 
2 1476450713 1476450727 9.03924 9.03995 45.61362 45.61365 55.38651  14 14.2422459 green 
3 1476450727 1476450751 9.03995 9.04005 45.61365 45.61340 28.89870  24 4.3348057 green 
4 1476450751 1476450777 9.04005 9.04017 45.61340 45.61406 74.06267  26 10.2548313 green 
5 1476450777 1476450873 9.04017 9.03949 45.61406 45.61419 54.89125  96 2.0584219 green 
6 1476450873 1476450920 9.03949 9.03496 45.61419 45.61319 369.88687  47 28.3317600 green 
7 1476450920 1476450930 9.03496 9.03440 45.61319 45.61295 51.13973  10 18.4103034 green 
8 1476450930 1476450932 9.03440 9.03448 45.61295 45.61285 12.75643   2 22.9615714 green 
9 1476450932 1476450982 9.03448 9.03495 45.61285 45.61241 61.14351  50 4.4023330 green 
10 1476451362 1476451363 9.03553 9.03559 45.61197 45.61188 11.05462   1 39.7966396 green 
11 1476451363 1476451373 9.03559 9.03606 45.61188 45.61129 75.18742  10 27.0674701 green 
12 1476451373 1476451382 9.03606 9.03712 45.61129 45.61127 82.57276   9 33.0291031 green 
13 1476451382 1476451405 9.03712 9.04059 45.61127 45.61095 272.54942  23 42.6599094 green 
14 1476451405 1476451412 9.04059 9.04115 45.61095 45.61091 43.83450   7 22.5434586 green 
15 1476451412 1476451431 9.04115 9.04440 45.61091 45.61064 254.85994  19 48.2892512 green 

該文件表示兩個行程爲例(還有很多,但它只是給一個想法),理想點9號(第一次行程結束)不應該與第10點(第2次旅行的開始)相關聯。我得到這個用命令

ggmap(mapImageData)+ 
    geom_segment(data=trips, mapping=aes(y=trips$lat.start, x=trips$long.start, 
             yend=trips$lat.end, xend=trips$long.end),color=trips$color,size=1) 

做在此代碼mapImageData是單張的瓷磚,然後我增加點用命令geom_segment相當於,指定每個點的最初和最後的位置。

使用單張我必須使用命令addPolylines(data = mydata, lng = ~long, lat = ~lat, weight=1,color="purple")。所不同的是,這個命令要經度列和緯度的一列,在我的例子是這樣的

head(mydata, n=15) 
     lat long 
1 45.61335 9.03913 
2 45.61362 9.03924 
3 45.61365 9.03995 
4 45.61340 9.04005 
5 45.61406 9.04017 
6 45.61419 9.03949 
7 45.61319 9.03496 
8 45.61295 9.03440 
9 45.61285 9.03448 
10 45.61197 9.03553 
11 45.61188 9.03559 
12 45.61129 9.03606 
13 45.61127 9.03712 
14 45.61095 9.04059 
15 45.61091 9.04115 

但這將連接所有的點,我怎麼能知道什麼時候不連點?例如位置號碼。 9和10不應該相互關聯。 謝謝, Marco

+0

可以融化的數據,並保留該行的名稱。使用'group'參數(行名稱將是分組)來指定開始和結束。 – troh

回答

1

首先,我們需要一種方法來區分不同的旅行。
我用

df$group <- c(rep(1, 9), rep(2, 6)) 

根據你所說的話,但修改df,因爲它適合。

在此之後,我們將增加一個折線爲每個組:

m <- leaflet(df) %>% 
    addTiles() 

for (i in unique(df$group)) { 
    m <- m %>% 
     addPolylines(data = df[df$group == i, ], 
        lng = ~long.start, 
        lat = ~lat.start) 
} 

結果:

enter image description here

儘管是一個for loop這是相當快的。爲了加快了一個檔次,我們可以使用一個lapply

m <- leaflet(df) %>% 
     addTiles() 

lapply(unique(df$group), 
     function(x) { 
      addPolylines(m, 
         data = df[df$group == x, ], 
         lng = ~long.start, 
         lat = ~ lat.start) 
     }) 
rbenchmark::benchmark(
    apply = { 

     m <- leaflet(df) %>% 
      addTiles() 

     lapply(unique(df$group), function(x) { 
      addPolylines(m, 
         data = df[df$group == x, ], 
         lng = ~long.start, 
         lat = ~ lat.start) 
     }) 
    }, 
    forcycle = { 

     m <- leaflet(df) %>% 
      addTiles() 

     for (i in unique(df$group)) { 
      addPolylines(m, 
         data = df[df$group == i, ], 
         lng = ~long.start, 
         lat = ~lat.start) 
     }}, 
    replications = 1000) 
#>  test replications elapsed relative user.self sys.self user.child 
#> 1 apply   1000 2.91 1.000  2.92  0   NA 
#> 2 forcycle   1000 3.04 1.045  3.00  0   NA 
+0

非常感謝您的幫助,它完美地工作,只是一個問題,有沒有一種方法可以在沒有for循環的情況下複製相同的結果?比如ggmap會怎麼做?我只是想問這個問題,因爲當有很多迭代時,for循環通常非常慢。非常感謝 –

+0

更新了一些基準 – GGamba