2013-06-12 2 views
4

Привет, сообщество stackoverflow!Choropleth map with R using shp file

Может кто-то любезно, пожалуйста, помогите мне, поскольку у меня возникают некоторые трудности с созданием карты choropleth в R. На данный момент я назначил LL-информацию в мои достопримечательности, и теперь я хочу создать карту choropleth, используя переменная «cans» в наборе данных (data.csv) по району средней школы (highdist_n83.shp.zip). Я хотел бы, чтобы вы знаете, как правильно заполнить карту суммой банок на районную площадь. Я предоставил код, который извлекает примерный файл данных из dropbox и файл формы, который я хотел бы использовать.

EDIT К сожалению, я забыл добавить, что, когда я сюжет только файл формы, я могу видеть, что это оказывается через ggplot. Однако, когда я пытаюсь «заполнить» районы, используя число переменных «cans», R некоторое время висит перед тем, как отобразить то, что кажется массой линий над исходной фигурой. Интересно, если ошибка происходит из-за следующие возможные причины

  1. файла форма не является хорошим
  2. может быть проблемой с тем, как я сливая кадр данных и файл формы, как я заметил, дополнительным строки добавляются в объединенный файл
  3. В области есть несколько школ, которые я не комбинировал при использовании ddply.

Благодарим вас за внимание!

###load R scripts from dropbox 
dropbox.eval <- function(x, noeval=F) { 
require(RCurl) 
intext <- getURL(paste0("https://dl.dropboxusercontent.com/",x), ssl.verifypeer = FALSE) 
intext <- gsub("\r","", intext) 
if (!noeval) eval(parse(text = intext), envir= .GlobalEnv) 
return(intext) 
} 

##pull scripts from dropbox 
dropbox.eval("s/wgb3vtd9qfc9br9/pkg.load.r")  
dropbox.eval("s/tf4ni48hf6oh2ou/dropbox.r") 

##load packages 
pkg.load(c(ggplot2,plyr,gdata,sp,maptools,rgdal,reshape2)) 

###setup data frames 
dl_from_dropbox("data.csv","dx3qrcexmi9kagx") 
    data<-read.csv(file='data.csv',header=TRUE) 

###prepare GIS shape and data for plotting 
dropbox.eval("s/y2jsx3dditjucxu/dlshape.r")  
temp <- tempfile() 
dlshape(shploc="http://files.hawaii.gov/dbedt/op/gis/data/highdist_n83.shp.zip", temp) 
shape<- readOGR(".","highdist_n83") #HDOE high school districts 
[email protected] 

shape2<- spTransform(shape, CRS("+proj=longlat +datum=NAD83")) 

data.2<-ddply(data, .(year, schoolcode, longitude, latitude,NAME,HDist,SDist), summarise, 
     total = sum(total), 
     cans= sum(cans)) 

coordinates(data.2) <-~longitude + latitude 
shape2.df<-fortify(shape2) 
mshape2.df<- merge(shape2.df,[email protected], by.x="id", by.y="ID",all=TRUE) 

newdata <- merge(mshape2.df,data.2, by.x="NAME", by.y="NAME", all=TRUE) 
newdata <- newdata [order(newdata $order),] 

###choropleth map: 
mapPlot <- ggplot(newdata,aes(x=long, y=lat,drop=FALSE)) + 
geom_polygon(aes(fill=cans, drop=FALSE), colour = "black", lwd = 1/9,na.rm=FALSE) 
+ ggtitle("Total of Cans Across State") 
print(mapPlot) 
+3

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

+0

Hi SlowLearner. Я отредактировал свое оригинальное сообщение, чтобы описать проблему, которую я испытываю. Это довольно долго, но я надеюсь, что это может прояснить, с чем мне нужна помощь. После запуска ggplot-кода R в основном зависает некоторое время, прежде чем отображать то, что выглядит массивным количеством строк над файлом формы. Я перечислил некоторые возможные проблемы, но опять же я полный новичок в этом деле ... Еще раз спасибо за ваше время! :) – user2300643

ответ

7

Когда вы укрепляете шейп-файл, вы получаете неправильные идентификаторы. Вместо этого явно добавьте столбец идентификатора на основе имен строк файла формы и используйте его для объединения. Вы также не указываете geom_polygon, как группировать строки в вашем data.frame, чтобы они были построены как один непрерывный перекрывающий, самопересекающийся многоугольник. Добавьте групповой аргумент в geom_polygon. Я также хотел бы использовать RColorBrewer, чтобы выбрать красивые цвета для карт (используя функцию brewer.pal).

Попробуйте это:

require(RColorBrewer) 
[email protected]$id <- rownames([email protected]) 
sh.df <- as.data.frame(shape2) 
sh.fort <- fortify(shape2 , region = "id") 
sh.line<- join(sh.fort, sh.df , by = "id") 


mapdf <- merge(sh.line , data.2 , by.x= "NAME", by.y="NAME" , all=TRUE) 
mapdf <- mapdf[ order(mapdf$order) , ] 

ggplot(mapdf , aes(long , lat))+ 
    geom_polygon(aes(fill = cans , group = id) , colour = "black")+ 
    scale_fill_gradientn(colours = brewer.pal(9 , "Reds"))+ 
    coord_equal() 

enter image description here

+0

Спасибо! Я бы никогда не понял это без вашей помощи! Он отлично работал, и пакет RColorBrewer представляет собой огромное улучшение визуально. – user2300643

+1

@ user2434624 Я рад, что это помогло вам. Да, пакет «ColorBrewer» отлично! –

+0

Извините, это просто появилось у меня в голове ... Я не уверен, что для этого требуется задать новый вопрос, но как я могу превратить укрепленный/объединенный файл обратно в файл формы? В частности, я хотел бы записать его как данные GeoJSON с помощью функции writeOGR() ... – user2300643

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