了解ggplot2 geom_map map_id

时间:2015-07-14 15:23:56

标签: r ggplot2

这来自ggplot2文档:

# Better example
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)
library(reshape2) # for melt
crimesm <- melt(crimes, id = 1)
if (require(maps)) {
  states_map <- map_data("state")
  ggplot(crimes, aes(map_id = state)) + geom_map(aes(fill = Murder), map = states_map) + expand_limits(x = states_map$long, y = states_map$lat)
  last_plot() + coord_map()
  ggplot(crimesm, aes(map_id = state)) + geom_map(aes(fill = value), map = states_map) + expand_limits(x = states_map$long, y = states_map$lat) + facet_wrap( ~ variable)
}

我不明白这是如何工作的,因为states_map数据框中没有使用“region”来命名states列的crimes数据框和标记状态的states_map数据框的公共标识符, “状态。”是什么将数据与地图联系起来?

在此example中,海报重命名地图数据框的列以符合数据,但ggplot2文档似乎没有这样做。怎么样?当我在上面的示例中重命名crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests) library(reshape2) # for melt crimesm <- melt(crimes, id = 1) if (require(maps)) { states_map <- map_data("state") ##### my attempt to fix what isn't broken ################# names(states_map)[5]<-"state" ########################################################### ggplot(crimes, aes(map_id = state)) + geom_map(aes(fill = Murder), map = states_map) + expand_limits(x = states_map$long, y = states_map$lat) last_plot() + coord_map() # Error: all(c("x", "y", "id") %in% names(map)) is not TRUE } 的列时,以便“状态”对于两个数据帧都是通用的,它会破坏代码。

- (BOOL) navigationShouldPopOnBackButton
{
    [self backAction];
    return NO;
}

- (void) backAction {
    // your code goes here
    // show confirmation alert, for example
    // ...
}

感谢。

1 个答案:

答案 0 :(得分:1)

如果您查找geom_map的代码:

function (mapping = NULL, data = NULL, stat = "identity", ..., 
    map, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) 
{
    stopifnot(is.data.frame(map))
    if (!is.null(map$lat)) 
        map$y <- map$lat
    if (!is.null(map$long)) 
        map$x <- map$long
    if (!is.null(map$region)) 
        map$id <- map$region
    stopifnot(all(c("x", "y", "id") %in% names(map)))

# etcetera...
}

这意味着,为了正确构建几何图形,将使用x,y和id列生成数据帧map。使用aes(map_id = state),您基本上是将crimes$state分配给map$id(据我了解)

如果地图数据中没有id列,则称为region的列将用作您的id列。 您可以通过将states_map$region的名称更改为states_map$id

进行测试
names(states_map)[5]<-"id" 

这适用于给定的示例。