我正在制作一个在ggplot中添加点的等值区域地图。 因此,请遵循geom_map help docs
的最后一个示例我想出了这个:
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通过将地图数据与等值数据合并并使用geom_polygon
来完成同样的事情而没有问题,这似乎更直截了当。 (我花了一些时间来计算ID映射,因为我没有意识到我必须删除region
列名才能成功使用id
。并且第一个的语法方法对我来说似乎仍然很奇怪。)
所以,有两个问题:
geom_map
上面显示的方法从不同的数据框添加点? geom_map
而不是geom_polygon
方法有什么好处吗?答案 0 :(得分: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
的包装。它是一个包含所有地理设置的图层(lat和long按ID分组)。
我绘制地图时使用geom_map
,geom_polygon
绘制任何多边形类型。
修改强> 添加地图
答案 1 :(得分: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_map
还是geom_polygon
,我还没有真正考虑过这个问题。也许其他人有观点。