2015-04-06 4 views
2

Я пытаюсь сделать карту с тремя слоями, используя ggmap. Слои являются следующие:Построение текстовых меток над данными geom_polygon в ggmap в R

  1. Карта США (тонер-лайт)
  2. набор геометрий, что цвет состояния на некоторую величину (гипотетические данные ниже)
  3. этикетки для государственных названий, как аннотации в центре каждого государства.

Для этого я создал карту штатов США с состояниями, окрашенными рандомизированным значением (rnorm), и эта часть успешно выполнена. Отсюда я пытаюсь напечатать аббревиатуры каждого состояния по координатам долготы и широты центра каждого государства, используя geom_text. Часть, которая не является «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).

Вот скрипт, который я упорно трудился, чтобы работать как в одиночку. Он загрузит шейп-файл и центр данных состояния, а также смоделирует данные для заполнения состояний. Я тестировал его, и он работает до того, что я прокомментировал (слой 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 
+0

Это не источник ошибки, но вы не должны использовать 'tract_poly' в качестве фрейма данных для' geom_text'. Для 'geom_text' вам нужна одна строка для каждого состояния, но' tract_poly' имеет тысячи строк для каждого состояния (по одному для каждого сегмента государственных границ). Например, вы можете использовать 'data = tract_poly%>% group_by (state)%>% slice (1)'. – eipi10

ответ

1

Это странное сообщение об ошибке для того, что в конечном итоге является проблемой. Где-то по пути вы выбрали широту и долготу для центров. (Я также принял во внимание рекомендацию 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") 
+0

Спасибо всем за совет. Сейчас я работаю над исправлением, и все это имеет общий смысл. Из того, что я читал, ошибка, вероятно, была связана с тем, что построение за пределами отображаемого диапазона, которое бы имело смысл, чтобы локоть/лат-координаты были перевернуты. Будет обновляться после того, как я успею заставить его работать. –

+0

Принимая во внимание исправление GregF (которое учитывает советы elpi), я смог заставить это работать. Проблема была в строке 'names (центры) [2: 3] <- c ('long_c', 'lat_c')' Что изменилось на длинный/лат путем переименования. Он был заменен: 'имен (центров) [2: 3] <- с ('lat_c', 'long_c')' Затем я использовал карту добавление GregF в 'geom_text (АЕС (х = new_long, у = new_lat, label = state), данные = центры, alpha = 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)

Смежные вопросы