【问题标题】:Using ggmap to visualize the location-based data in R使用 ggmap 可视化 R 中基于位置的数据
【发布时间】:2015-10-24 18:55:22
【问题描述】:

我在 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)

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

为了使用 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 数据框的气泡图?

【问题讨论】:

  • 是的,您必须使用字符串函数将 lon/lat 值拆分/提取到另外两列中。

标签: r google-maps


【解决方案1】:

这是一种方法。正如 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))

【讨论】:

  • 我已成功提取纬度和经度作为变量。但是,当我尝试运行cambridgemap + geom_point(aes(x=lon, y=lat, color="violation"), data=loc) 时,它会打印Error: Discrete value supplied to continuous scale 作为结果。我确实有多次使用的纬度和经度值(例如,当违规发生在同一位置两次时)。这会是问题吗?如果是这样,有什么办法可以解决吗?
  • @MichaelCKang violation 是什么?这是你创建的变量吗?
  • @MichaelCKang 如果你有重复,你可能想考虑我的第一个选择。您基本上需要计算每个数据点发生的次数。因此,您使用group_bysummarize
【解决方案2】:

从评论开始,类似:

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”缩放级别,这些点将重叠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多