2013-02-05 108 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

相關問題