在R中的ggmap中的geom_polygon数据上绘制文本标签

时间:2015-04-06 19:25:25

标签: r overlay gis ggmap annotate

我正在尝试使用ggmap制作一个包含三个图层的地图。各层如下:

  1. 美国地图(toner-lite)
  2. 一组几何图形,用于为某些值上的状态着色(下面的模拟数据)
  3. 州名的标签,作为每个州中心的注释。
  4. 为此,我创建了一个美国州的地图,其中的州以随机值(rnorm)着色,这部分是成功的。从这里开始,我试图使用geom_text在每个州的中心的经度和纬度坐标处打印每个州的缩写。失败的部分是' geom_text'覆盖,出现以下错误:

      

    错误:' x'和'单位'必须有长度> 0另外:警告   消息:1:在gpclibPermit()中:支持gpclib   在下一个主要版本2中退出maptools:删除了855070   包含缺失值的行(geom_text)。

    这是脚本,我已经努力独立运行。它将下载shapefile和状态中心数据,以及模拟数据以填充状态。我已经对它进行了测试,它符合我所评论的内容(geom_text图层)。

    我已经搜索了这个问题的答案,所以如果您对如何做我正在尝试的事情有任何建议,请告诉我。如果有更好的策略在多边形填充物上放置标签,我就是耳朵(或者在这种情况下是眼睛)。

    ###Combining Census data with a tract poly shapefile
    library(maptools)
    library(ggplot2)
    library(gpclib)
    library(ggmap)
    library(rgdal)
    library(dplyr)
    
    #Set working directory to where you want your files to exist (or where they already exist)
    setwd('~/Documents/GIS/USCensus/')
    #Read and translate coord data for shape file of US States
    if(!file.exists('tl_2014_us_state.shp')){
            download.file('ftp://ftp2.census.gov/geo/tiger/TIGER2014/STATE/tl_2014_us_state.zip',
                          'tl_2014_us_state.zip')
            files <- unzip('tl_2014_us_state.zip')
            tract <- readOGR(".","tl_2014_us_state") %>% spTransform(CRS("+proj=longlat +datum=WGS84"))
    } else {
            tract <- readOGR(".","tl_2014_us_state") %>% spTransform(CRS("+proj=longlat +datum=WGS84"))
    }
    
    #two column dataset of state abbreviations and center of state
    #Downloadable from: https://dev.maxmind.com/static/csv/codes/state_latlon.csv
    if(!file.exists('state_latlon.csv')){
            download.file('http://dev.maxmind.com/static/csv/codes/state_latlon.csv','state_latlon.csv')
    }
    centers <- read.csv('state_latlon.csv')
    #Change values of longitude and latitude from state center data so as not to interfere with shapefile at merge
    names(centers)[2:3] <- c('long_c','lat_c')
    
    #simulated data for plotting values
    mydata<- data.frame(rnorm(55, 0, 1)) #55 "states" in the coord dataset for state centers
    names(mydata)[1] <- 'value'
    
    #hold names in tract dataset and for simulated data
    ntract<-names(tract)
    ndata<-names(mydata) 
    
    #Turn geo data into R dataframe
    gpclibPermit()
    tract_geom<-fortify(tract,region="STUSPS")
    
    #Merge state geo data with simulated data
    state_data <- cbind(centers,mydata)
    #merge state center and value data with shapefile data
    tract_poly <- merge(state_data,tract_geom,by.x="state",by.y="id", all = F) 
    tract_poly<-tract_poly[order(tract_poly$order),]
    
    #Create map of US
    mymap <- get_stamenmap(bbox = c(left = -124.848974,
                                    bottom = 24.396308,
                                    right = -66.885444,
                                    top = 49.384358),zoom=5,
                           maptype="toner-lite")
    
    #This plots a map of the US with just the state names as labels (and a few other landmarks). Used for reference
    USMap <- ggmap(mymap,extent='device') +
            geom_polygon(aes(x = long, y = lat, group = group, fill = value),
                         data = tract_poly,
                         alpha = 1, 
                         color = "black",
                         size = 0.2) #+
    #         geom_text(aes(x = long_c, y = lat_c, group = group, label = state),
    #                   data= tract_poly,
    #                   alpha = 1,
    #                   color = "black")
    
    USMap
    

2 个答案:

答案 0 :(得分:2)

这是一个奇怪的错误消息,最终成为了问题。在某个地方,你已经为中心翻了纬度和经度。 (我还考虑了以上elpi的建议,并没有直接使用你的中心数据集来重复绘制缩写)。以下代码有效,但我建议修复您的中心数据集。

centers$new_long <- centers$lat_c
centers$new_lat <- centers$long_c
USMap <- ggmap(mymap,extent='device') +
        geom_polygon(aes(x = long, y = lat, group = group, fill = value),
                     data = tract_poly,
                     alpha = 1, 
                     color = "black",
                     size = 0.2) +
         geom_text(aes(x = new_long, y = new_lat, label = state),
                   data= centers,
                   alpha = 1,
                   color = "black")

答案 1 :(得分:1)

试试这个

centroids <- setNames(do.call("rbind.data.frame", by(tract_poly, tract_poly$group, function(x) {Polygon(x[c('long', 'lat')])@labpt})), c('long', 'lat')) 
centroids$label <- tract_poly$state[match(rownames(centroids), tract_poly$group)]
USMap + with(centroids, annotate(geom="text", x = long, y=lat, label = label, size = 2.5))

via