使用ggmap可视化R

时间:2015-10-24 08:19:27

标签: r google-maps

我在R中有一个像这样的位置数据框......

cambridgeparking <- read.csv("camparking.csv")

ID     Location
1      85 BRATTLE ST Cambridge, MA (42.37587649000045, -71.12423110899965)
2      47 BRATTLE ST Cambridge, MA (42.37421138600047, -71.12166838499962)
3      130 HARVARD ST Cambridge, MA (42.3653084390005, -71.09376133099966)

变量“位置”包含实际街道名称&amp;括号内的经度和纬度。

为了使用ggmap可视化基于位置的数据,我使用这些代码来获取剑桥的地图

cambridge <- get_map(location = "cambridge, MA", zoom=10)
cambridgemap <- ggmap(cambridge)

然后,我想创建一个包含这些位置的气泡图

cambridgemap + geom_point(aes(x=Location, y=Location), data=cambridgeparking$Location)

在执行此代码失败后,我意识到R无法通过简单地将x和y值设置为“位置”来识别数据框中的经度和纬度。

我有办法使用ggmap创建带有cambridgeparking数据框的气泡图吗?

2 个答案:

答案 0 :(得分:0)

继续发表评论,例如:

ll <- stringr::str_match_all(cambridgeparking$Location, 
                    "\\(([[:digit:]\\.-]+),[[:space:]]+([[:digit:]\\.-]+)")

cambridgeparking$lat <- as.numeric(ll[[1]][,2])
cambridgeparking$lon <- as.numeric(ll[[1]][,3])

然后在geom_point中使用那些纬度/经度值。请注意,在“10”缩放级别,这些点将重叠。

答案 1 :(得分:0)

这是一种方法。正如hrbrmstr所提到的,你需要在这里提取lon和lat的数字。就我而言,我使用stringi包来完成这项工作。使用dplyr包中的mutate(),我创建了两个新列(即lon和lat)。然后,我计算了每对lon和lat存在多少数据点。出于这个原因,我修改了您的示例数据。使用计数,您可以在绘制图形时控制气泡的大小。

mydf <- data.frame(id = 1:6,
                   Location = c("85 BRATTLE ST Cambridge, MA (42.37587649000045, -71.12423110899965)",
                                "85 BRATTLE ST Cambridge, MA (42.37587649000045, -71.12423110899965)",
                                "85 BRATTLE ST Cambridge, MA (42.37587649000045, -71.12423110899965)",
                                "85 BRATTLE ST Cambridge, MA (42.37587649000045, -71.12423110899965)",
                                "47 BRATTLE ST Cambridge, MA (42.37421138600047, -71.12166838499962)",
                                "130 HARVARD ST Cambridge, MA (42.3653084390005, -71.09376133099966)"),
                   stringsAsFactors = FALSE)

library(stringi)
library(dplyr)
library(ggmap)

mutate(mydf, lat = as.numeric(stri_extract_first_regex(str = Location,pattern = "\\d+\\.\\d+")),
             lon = as.numeric(stri_extract_last_regex(str = Location,pattern = "-\\d+\\.\\d+"))) %>%
group_by(lon, lat) %>%
summarize(total = n()) -> mydf2

#mydf2
#        lon      lat total
#      (dbl)    (dbl) (int)
#1 -71.12423 42.37588     4
#2 -71.12167 42.37421     1
#3 -71.09376 42.36531     1

cambridge <- get_map(location = "cambridge, MA", zoom=10)

ggmap(cambridge) +
geom_point(data = mydf2, aes(x = lon, y = lat, size = total))

如果没有重复的位置,您可以执行以下操作。

mutate(mydf, lat = as.numeric(stri_extract_first_regex(str = Location,pattern = "\\d+\\.\\d+")),
             lon = as.numeric(stri_extract_last_regex(str = Location,pattern = "-\\d+\\.\\d+"))) -> mydf2

ggmap(cambridge) +
geom_point(data = mydf2, aes(x = lon, y = lat))

enter image description here