2013-02-05 197 views
3

我正在ggplot中添加点的choropleth地图。 所以,以下的geom_map help docs什么时候应该使用geom_map?

最后一个例子,我想出了这一点:

require(ggplot2) 
require(maps) 

set.seed(47) 
county_map <- map_data("county", "washington") 
names(county_map)[5:6] <- c("state", "id") 
countyData <- data.frame(id = unique(county_map$id), value = rnorm(39)) 
map1 <- ggplot(countyData, aes(map_id = id)) + 
    geom_map(aes(fill = value), map = county_map, colour = "black") + 
    coord_map() + 
    expand_limits(x = county_map$long, y = county_map$lat) 

print(map1) 

这对于地区分布图的伟大工程。 (题外话,我很高兴与map_data功能)。但后来我尝试加分

pointData <- structure(list(xx = c(-119.872483243387, -122.809038239929, 
-122.143143065312 
), yy = c(48.1320425447619, 46.7352071436801, 47.9911548514037 
)), .Names = c("xx", "yy"), row.names = c(1746L, 7281L, 2692L 
), class = "data.frame") 

map1 + geom_point(mapping = aes(xx, yy), data = pointData) 

我不能得到它的工作。我尝试了很多变体,将group设置为NULL,命名aes参数等。没有运气。因此,我发现this question通过合并地图数据和choropleth数据并使用geom_polygon来完成同样的工作,而且没有问题,这看起来更直接。 (我花了一段时间才开始编制ID映射,因为我没有意识到必须删除region列名才能成功使用id,而第一种方法的语法对我来说似乎仍然很奇怪。)

所以,两个问题:

  1. 它是如何可以从使用具有上述geom_map所示的方法不同的数据帧中添加点?
  2. 更重要的是,使用geom_map而不是geom_polygon方法有什么优势?
+2

'geom_map'通常比'geom_polygon'快得多,因为它可以以更高效的方式进行合并。 – hadley

回答

2

你眼前的问题是,ggplot没有办法的点数据绑定到地图。看着你的数据帧,你有这样的地图:

str(countyData) 
'data.frame': 39 obs. of 2 variables: 
$ id : chr "adams" "asotin" "benton" "chelan" ... 
$ value: num 1.995 0.711 0.185 -0.282 0.109 ... 

...这对于您的观点:

str(pointData) 
'data.frame': 3 obs. of 2 variables: 
$ xx: num -120 -123 -122 
$ yy: num 48.1 46.7 48 

你看到任何公共变量存在,将允许ggplot找到您点?

不过,问题很容易解决。我通常使用geom_polygon而不是geom_map,但这很大程度上没有习惯。这有效,例如:

colnames(pointData) <- c('long','lat') # makes consistent with county_map 
pointData$group <- 1 # ggplot needs a group to work with 
county_map$value <- sapply(1:nrow(county_map), 
          function(x) round(runif(1, 1, 8), 0)) # for colours 

ggplot(county_map, aes(x = long, y = lat, group = group)) + 
    geom_polygon(aes(fill = value)) + 
    coord_map() + 
    geom_point(data = pointData, aes(x = long, y = lat), shape = 21, fill = "red") 

其中给出以下(注意点)。 screenshot

但是,至于是否应该使用geom_mapgeom_polygon,我还没有真正考虑过这个问题。也许别人有看法。

3

这个工作对我来说:

map1 <- ggplot(countyData) + 
    geom_map(map = county_map, aes(map_id = id,fill = value), 
      colour = "black") + coord_map() + 
    expand_limits(x = county_map$long, y = county_map$lat) 
    map1 + geom_point(mapping = aes(xx, yy), data = pointData) 

对我来说geom_mapgeom_polygon的包装。它是一个包含所有地理设置的图层(lat和long按id分组)。

我会使用geom_map当我绘制地图和geom_polygon绘制任何多边形类型。

编辑 要添加地图

enter image description here

相关问题