本周我一直试图让这个lovely flowing data visualization有所不同,但在最后的实施中仍然遇到了障碍。
以下是data set我正在使用的内容。我把它融合到一个框架中,其中包含我要显示的三个关键信息:startinglatlong,endinglatlong和trip of trips。
我最接近使用posted here的想法,但有两个在两个项目上遇到了障碍:
1)根据行程数改变线的大小 2)获取google api允许我调用这么多行(我的数据集中有55,704个)。
counts是我的完整df的名称,看起来像这样:
head(counts)
X from_station_id.x to_station_id.x From_Station_Lat From_Station_Long End_Station_Lat End_Station_Long n eichel
1 1 5 5 41.87396 -87.62774 41.87396 -87.62774 275 41.87395806 -87.62773949
2 2 5 13 41.87396 -87.62774 41.93250 -87.65268 1 41.93250008 -87.65268082
3 3 5 14 41.87396 -87.62774 41.85809 -87.65107 12 41.858086 -87.651073
4 4 5 15 41.87396 -87.62774 41.85645 -87.65647 19 41.856453 -87.656471
5 5 5 16 41.87396 -87.62774 41.91033 -87.67252 7 41.910329 -87.672516
6 6 5 17 41.87396 -87.62774 41.90332 -87.67273 5 41.90332 -87.67273
thomas
1 41.87395806 -87.62773949
2 41.87395806 -87.62773949
3 41.87395806 -87.62773949
4 41.87395806 -87.62773949
5 41.87395806 -87.62773949
6 41.87395806 -87.62773949
然后我开始为想法帖子中的函数制作一个更简单的df,la:
start<-c(counts[1:10,9])
dest<-c(counts[1:10,10])
我想我可能会在函数中添加数字,所以我在n上标记(可能不是最好的命名约定,但在这里坚持我)。
n <- c(counts[1:10, 8])
然后是路径搜索功能:
leg <-function(start, dest){
r<- route(from=start,to=dest,mode = c("bicycling"),structure = c("legs"))
c<- geom_leg(aes(x = startLon, y = startLat, xend = endLon, yend = endLat),
alpha = 2/4, size = 2, data = r, colour = 'blue')
return (c)
}
基本地图:
a<-qmap('Chicago', zoom = 12, maptype="roadmap", color="bw")
现在神奇了:
for (n in 1:10){
#l<-leg(start[n], dest[n])
l<-leg(as.character(df[n,1]), as.character(df[n,2]))
a<-a+l
}
a
这很有用。
不幸的是,当我尝试在更大的子集上运行它时会运行一点然后去:
Information from URL : http://maps.googleapis.com/maps/api/directions/json? origin=41.88871604+-87.64444785&destination=41.87395806+-87.62773949&mode=bicycling&units=metric&alternatives=false&sensor=false
Error: (list) object cannot be coerced to type 'integer'
我从搜索此处和其他地方了解到这可能是由于谷歌门控api呼叫,所以尝试添加Sys.sleep(1),但这会破坏,所以去了Sys.sleep(1.5)并且坦率地说似乎还是。即使这是一个非常昂贵的电话,因为对于+ 55k行,你会看到+23小时的电话。我的代码是:
for (n in 1:30){
#l<-leg(start[n], dest[n])
l<-leg(as.character(df[n,1]), as.character(df[n,2]))
Sys.sleep(1.5)
a <- a + l
a}
这似乎在运行,但是当我进入&#34; a&#34;我得到了:
Error in eval(expr, envir, enclos) : object 'startLon' not found
最后如上所述,我想为更多使用的路线想象更粗的线条。通常我会通过aes执行此操作并执行以下操作:
geom_path(
aes(x = lon, y = lat), colour = 'red', size = n/100,
data = df, lineend = 'round'
)
因此它将读取列n并根据路由数量授予大小。为了在这里工作,我需要将这个数字绑定到路线路线,所以我写了第二个这样的函数:
leg <-function(start, dest, n){
r<- route(from=start,to=dest,mode = c("bicycling"),structure = c("route"))
c<- geom_leg(aes(x = startLon, y = startLat, xend = endLon, yend = endLat),
alpha = 2/4, size = n/10, data = r, colour = 'blue')
return (c)
}
for (n in 1:55704){
#l<-leg(start[n], dest[n])
l<-leg(as.character(df[n,1]), as.character(df[n,2]), as.numeric(df[n,3]))
Sys.sleep(1)
a <- a+l
}
这跑了一分钟然后因错误而死:
Error: (list) object cannot be coerced to type 'integer'
但是较短的版本非常接近:
for (n in 2:6){
#l<-leg(start[n], dest[n])
l<-leg(as.character(df[n,1]), as.character(df[n,2]), as.numeric(df[n,3]))
Sys.sleep(1)
a <- a+l
}
据我所知,它起作用了,但仅仅是30个。可悲的是,较长的版本只是耗尽了。基本上我认为,如果我能够通过我几乎在那里的错误消息,我就不想花费数天来运行查询。欢迎所有帮助和投入。谢谢你的时间。
答案 0 :(得分:1)
leg <-function(start, dest, n){
r<- route(from=start,to=dest,mode = c("walking"),structure = c("route"))
c<- geom_path(aes(x = lon, y = lat),
alpha = 2/4, size = as.numeric(n)/500, data = r, colour = 'blue')
Sys.sleep(runif(1, 3.0, 7.5))
return (c)
}
a <- qmap('Chicago', zoom = 12, maptype = 'road', color="bw")
for (n in 101:200){
l<-leg(as.character(df[n,1]), as.character(df[n,2]),as.character(df[n,3]))
a<-a+l
}
a
这很有效。唯一的障碍是谷歌api拒绝接听电话。在我添加随机变量sys.sleep后,它顺利工作。也就是说,我仍然没有尝试超过150次(为了便于视觉和功能,限制了我对前10%路线样本的映射)。经过一些快乐的插画家时间后,我最终得到了一张好看的地图。感谢社区的兴趣和提供循环的想法。