簡體   English   中英

在R中的ggmap中的geom_polygon數據上繪制文本標簽

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

我正在嘗試使用ggmap制作具有三層的地圖。 層如下:

  1. 美國地圖(淺粉)
  2. 一組為狀態上的某些值着色的幾何(下面的模擬數據)
  3. 狀態名稱的標簽,作為每個狀態中心的注釋。

為此,我創建了一個美國州地圖,這些州的狀態用隨機值(rnorm)着色,並且此部分成功完成。 從這里開始,我嘗試使用geom_text在每個州中心的經度和緯度坐標處打印每個州的縮寫。 失敗的部分是'geom_text'覆蓋,帶有以下錯誤:

錯誤:“ x”和“單位”的長度必須大於0另外:警告消息:1:在gpclibPermit()中:在下一個主要版本中,將從maptools中撤消對gpclib的支持2:刪除了包含缺失值的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

對於最終的問題,這是一個奇怪的錯誤消息。 一路上的某個地方,您已經翻轉了中心的經度和緯度。 (我也考慮了上面的elpi的建議,沒有直接使用您的center數據集重復繪制Initials)。 下面的代碼有效,但是我建議您修復中心數據集。

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

嘗試這個

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

通過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM