简体   繁体   English

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

[英]Plotting text labels over geom_polygon data in ggmap in R

I am attempting to make a map with three layers using ggmap. 我正在尝试使用ggmap制作具有三层的地图。 The layers are as follows: 层如下:

  1. A map of the US (toner-lite) 美国地图(浅粉)
  2. a set of geometries that color the states on some value (simulated data below) 一组为状态上的某些值着色的几何(下面的模拟数据)
  3. labels for the state names, as annotations in the center of each state. 状态名称的标签,作为每个状态中心的注释。

To do this I have created a map of US states with states colored by a randomized value (rnorm) and this part is successful. 为此,我创建了一个美国州地图,这些州的状态用随机值(rnorm)着色,并且此部分成功完成。 From here I am attempting to print the abbreviations of each state at the longitude and latitude coordinates of each state's center, using geom_text. 从这里开始,我尝试使用geom_text在每个州中心的经度和纬度坐标处打印每个州的缩写。 The part that fails is the 'geom_text' overlay, with the following error: 失败的部分是'geom_text'覆盖,带有以下错误:

Error: 'x' and 'units' must have length > 0 In addition: Warning messages: 1: In gpclibPermit() : support for gpclib will be withdrawn from maptools at the next major release 2: Removed 855070 rows containing missing values (geom_text). 错误:“ x”和“单位”的长度必须大于0另外:警告消息:1:在gpclibPermit()中:在下一个主要版本中,将从maptools中撤消对gpclib的支持2:删除了包含缺失值的855070行(geom_text) )。

Here is the script, which I have worked hard to run as on its own. 这是脚本,我一直努力运行,以单独运行。 It will download the shapefile and center of state data, as well as to simulate data to fill the states. 它将下载shapefile和状态中心数据,以及模拟数据以填充状态。 I've tested it and it works up to what I have commented out (geom_text layer). 我已经对其进行了测试,并且可以达到我注释掉的内容(geom_text层)。

I have searched for answers to this already, so please let me know if you have any advice on how to do what I am attempting. 我已经在寻找答案,因此,如果您对我的尝试有任何建议,请告诉我。 If there is a better strategy for placing labels on top of the polygon fills, I am all ears (or eyes in this case). 如果有更好的策略将标签放置在多边形填充的顶部,那么我将全神贯注(在这种情况下为眼睛)。

###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

That's a strange error message for what ended up being the problem. 对于最终的问题,这是一个奇怪的错误消息。 Somewhere along the way you have flipped the latitude and longitude for centers. 一路上的某个地方,您已经翻转了中心的经度和纬度。 (I also took into account elpi's advice above and didn't plot the Initials repeatedly by using your centers dataset directly). (我也考虑了上面的elpi的建议,没有直接使用您的center数据集重复绘制Initials)。 The code below works, but I'd recommend fixing your centers dataset. 下面的代码有效,但是我建议您修复中心数据集。

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")

Try this 尝试这个

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 ) 通过

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM