使用ggmap绘制形状文件:当shape文件大于ggmap时剪切

时间:2015-04-23 13:48:02

标签: r ggplot2 ggmap

当我尝试将ggmap与shape文件结合使用时,我遇到了剪辑问题。 Kahle和Wickham(2013:158)中的示例工作正常,因为ggmap中的栅格图像覆盖整个形状文件。下面是当我尝试在覆盖较小区域的ggmap图上绘制美国州的形状文件时会发生什么的示例。 ggmap显示了纽约市,我想用美国各州的边框覆盖它(仅作为示例)。生成的地图没有任何意义。问题是形状文件被剪裁,ggplot连接未剪切的点。下面是代码。形状文件来自here。我只是在这里展示最后的情节。

我该如何解决这个问题?

path <- "PATH TO SHAPEFILE"
library("ggmap")
library("rgdal")

# shapefile
states <- readOGR(dsn = path, layer = "states")
states_df <- fortify(states)
# plot shapefile
plot(states, lwd = 0.1)
ggplot(states_df, aes(long, lat, group = group)) +
    geom_polygon(colour = "black", fill = NA, size = 0.1)


# combine ggmap with shapefile
map <- get_map("new york city", zoom = 10, source = "stamen")
ggmap(map, extent = "device")

ggmap(map, extent = "device") +
    geom_polygon(aes(long, lat, group=group), data = states_df, colour = "red", fill = NA, size = 1)
Kahle,David和Hadley Wickham。 2013.“Ggmap:使用ggplot2进行空间可视化。”R Journal 5(1):144-61。

enter image description here

2 个答案:

答案 0 :(得分:4)

这是我的尝试。我经常使用GADM shapefile,您可以使用raster包直接导入。我将NY,NJ和CT的形状文件分类。您可能最终不必这样做,但最好减少数据量。当我绘制地图时,ggplot会自动删除保留在ggmap图像的bbox之外的数据点。因此,我没有做任何额外的工作。我不确定你使用的是哪个shapefile。但是,GADM的数据似乎与ggmap图像配合得很好。希望这对你有所帮助。

library(raster)
library(rgdal)
library(rgeos)
library(ggplot2)

### Get data (shapefile)
us <- getData("GADM", country = "US", level = 1)

### Select NY and NJ
states <- subset(us, NAME_1 %in% c("New York", "New Jersey", "Connecticut"))

### SPDF to DF
map <- fortify(states)

## Get a map
mymap <- get_map("new york city", zoom = 10, source = "stamen")


ggmap(mymap) +
geom_map(data = map, map = map, aes(x = long, y = lat, map_id = id, group = group))

enter image description here

如果您只想要线条,以下就是您的目标。

ggmap(mymap) +
geom_path(data = map, aes(x = long, y = lat, group = group))

enter image description here

答案 1 :(得分:2)

我会查看这个答案,看起来你想要的ggmap在放大时不会以理想的方式处理多边形,即不在图上的项目会被截断,导致形状文件的“有趣”结果。

Polygons nicely cropping ggplot2/ggmap at different zoom levels

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    static NSString *CellIdentifier = @"cell";

    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (nil == cell)
    {
        cell = [[Cell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    PFObject *tempObject = [_myArray objectAtIndex:indexPath.row];
    NSString *currentUser = [[PFUser currentUser]username];

    //NSLog(@"%@",tempObject);
    NSArray *test = [tempObject valueForKey:@"Like"];
    //NSLog(@"%lu",(unsigned long)test.count);


    NSTimeInterval now = [[[NSDate alloc] init] timeIntervalSince1970];
    if ((now - lastClick < 0.3) & [indexPath isEqual:lastIndexPath]) {

        //cell.test.hidden = NO;
        CGRect frame = CGRectMake(0,0, 80, 40);

        UILabel *label1 = [[UILabel alloc]init];

        label1.frame = frame;

        label1.text = @"first label";
        [cell.contentView addSubview:label1];


        if ([test containsObject:currentUser]) {
            NSLog(@"1");

            [tempObject removeObject:currentUser forKey:@"Like"];
            [tempObject saveInBackground];

        }else {
            NSLog(@"2");
            [tempObject addUniqueObject:currentUser forKey:@"Like"];
            [tempObject saveInBackground];
        }

    }

    lastClick = now;
    lastIndexPath = indexPath;

}

带输出: enter image description here

作为附注,您可能希望使用美国人口普查数据查看状态图,它们似乎质量高于ESRI数据集。

ftp://ftp2.census.gov/geo/pvs/tiger2010st/tl_2010_us_state10.zip

作为最后一点,在极点附近存在ggmap的问题,因此我还会根据您感兴趣的州对数据进行分组。