3

我正在制作一个在 ggplot 中添加点的等值线图。因此,按照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)

我无法让它工作。我尝试了很多变体,设置groupNULL,命名aes参数等。没有运气。所以我发现这个问题通过将地图数据与 choropleth 数据合并并使用 来完成完全相同的事情而没有问题,geom_polygon无论如何这似乎更简单。(首先我花了一点时间来计算 ID 映射,因为我没有意识到我必须删除region列名才能成功使用id. 而且第一种方法的语法对我来说仍然很奇怪。)

所以,两个问题:

  1. 如何使用上面显示的方法从不同的数据框中添加点geom_map
  2. geom_map更重要的是,与该geom_polygon方法相比,使用有什么优势吗?
4

2 回答 2

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_map是一个geom_polygon. 它是一个包含所有地理设置(按 id 分组的纬度和经度)的图层。

geom_map当我绘制地图并geom_polygon绘制任何多边形类型时,我会使用它。

编辑 添加地图

在此处输入图像描述

于 2013-02-05T02:04:45.447 回答
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")

这给出了以下内容(注意要点)。 截屏

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

于 2013-02-05T02:27:58.973 回答