Я пытаюсь сделать карту с тремя слоями, используя ggmap. Слои являются следующие:Построение текстовых меток над данными geom_polygon в ggmap в R
- Карта США (тонер-лайт)
- набор геометрий, что цвет состояния на некоторую величину (гипотетические данные ниже)
- этикетки для государственных названий, как аннотации в центре каждого государства.
Для этого я создал карту штатов США с состояниями, окрашенными рандомизированным значением (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
Это не источник ошибки, но вы не должны использовать 'tract_poly' в качестве фрейма данных для' geom_text'. Для 'geom_text' вам нужна одна строка для каждого состояния, но' tract_poly' имеет тысячи строк для каждого состояния (по одному для каждого сегмента государственных границ). Например, вы можете использовать 'data = tract_poly%>% group_by (state)%>% slice (1)'. – eipi10