2017-06-14 40 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