以前工作的 ggplot2 脚本现在在 fortify 返回致命错误

Previously working ggplot2 script now returning fatal error at fortify

我之前写过一个脚本来创建美国的彩色地图,每个州都根据一些模拟数据着色。这个想法是以后能够用一些措施代替模拟数据。它被编写为自包含的,最初 运行 很好,但现在当 fortify {ggplot2} 命令为 运行 时崩溃。

我认为这是由于 fortify 命令的问题造成的,因为它 returns 是一个致命错误并会在此时重新启动 R。这是致命错误之前的代码:

###Load libraries
library(maptools)
library(ggplot2)
library(ggmap)
library(rgdal)
library(dplyr)

#Set working directory to where you want your files to exist (or where they already exist)
#Download, 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 <- readShapeSpatial("./tl_2014_us_state.shp") #%>% spTransform(CRS("+proj=longlat +datum=WGS84"))
}
# shape<-readShapeSpatial("./fao/World_Fao_Zones.shp") 

#Download reference data for state names and abbreviations - a matter of convenience if there are 
#states for which you have no data
if(!file.exists('states.csv')){
        download.file('http://www.fonz.net/blog/wp-content/uploads/2008/04/states.csv',
                      'states.csv')
        states <- read.csv('states.csv')
} else {
        states <- read.csv('states.csv')
}

#simulated data for plotting values of some 'characteristic'
mydata           <- data.frame(rnorm(51, 0, 1)) #51 "states" in the state dataset
names(mydata)[1] <- 'value' #give the simulated column of data a name

#Turn geo data into R dataframe
tract_geom<-fortify(tract,region="STUSPS") #STUSPS is the state abbreviation which will act as a key for merge

脚本在上面的行停止工作并导致 R 崩溃并出现致命错误。我尝试了 another post 中描述的变通方法,其中您在空间数据框中放置一个显式 "id" 列,然后 fortify 默认将其用作键。通过此修改,行:

tract@data$id <- tract@data$STUSPS
tract_geom    <- fortify(tract)

将替换前面代码中的 tract_geom<-fortify(tract,region="STUSPS"), 其中 STUSPS 是以后数据合并的关键。

不幸的是,当我随后强化区域数据时,id 列不是预期的州缩写,而是一个介于“0”和“55”(56 个唯一值)之间的字符向量。州的缩写(共有 56 个)似乎以某种方式被 t运行 转换为数字,然后转换为字符。

我正在努力找出发生这种情况的原因并寻找修复方法。如果 fortify 函数与 region 参数一起使用,那将是理想的,但如果我能让解决方法起作用,那也太好了。任何帮助将不胜感激。我查看了各种类似问题的文档和解决方案,结果很短(甚至尝试过 ArcGIS)。

尝试:

readOGR(..., stringsAsFactors=FALSE, ...)

我能够通过 运行 update.packages() 解决我自己的问题。我不完全确定哪个包是罪魁祸首,但它可能是 maptoolsrgdalsp,因为这些包属于要更新的​​包,可能影响了问题。

最后,更新后,脚本以原始形式运行,tract_geom<-fortify(tract,region="STUSPS") 行完好无损。感谢那些帮助我解决这个问题的人。