2012-01-12 11 views
5

Dado un shapefile, ¿cómo configuro y uso un archivo de datos para poder trazar mapas temáticos utilizando identificadores que corresponden a regiones de formas en el shapefile?Trazado de mapas temáticos en R Uso de archivos shape y datos de diferentes fuentes

#Download English Government Office Network Regions (GOR) from: 
#http://www.sharegeo.ac.uk/handle/10672/50 
tmp_dir = tempdir() 
url_data = "http://www.sharegeo.ac.uk/download/10672/50/English%20Government%20Office%20Network%20Regions%20(GOR).zip" 
zip_file = sprintf("%s/shpfile.zip", tmp_dir) 
download.file(url_data, zip_file) 
unzip(zip_file, exdir = tmp_dir) 

library(maptools) 

#Load in the data file (could this be done from the downloaded zip file directly? 
gor=readShapeSpatial(sprintf('%s/Regions.shp', tmp_dir)) 

#I can plot the shapefile okay... 
plot(gor) 

#and I can use these commands to get a feel for the data... 
summary(gor) 
attributes([email protected]) 
[email protected]$NAME 
#[1] North East    North West    
#[3] Greater London Authority West Midlands   
#[5] Yorkshire and The Humber South West    
#[7] East Midlands   South East    
#[9] East of England   
#9 Levels: East Midlands East of England ... Yorkshire and The Humber 

#download data from http://www.justice.gov.uk/downloads/publications/statistics-and-data/courts-and-sentencing/csq-q3-2011-insolvency-tables.csv 
#insolvency<- read.csv("~/Downloads/csq-q3-2011-insolvency-tables.csv") 
insolvency=read.csv("http://www.justice.gov.uk/downloads/publications/statistics-and-data/courts-and-sentencing/csq-q3-2011-insolvency-tables.csv") 
insolvencygor.2011Q3=subset(insolvency,Time.Period=='2011 Q3' & Geography.Type=='Government office region') 
#tidy the data 
require(gdata) 
insolvencygor.2011Q3=drop.levels(insolvencygor.2011Q3) 

names(insolvencygor.2011Q3) 
#[1] "Time.Period"     "Geography"     
#[3] "Geography.Type"    "Company.Winding.up.Petition" 
#[5] "Creditors.Petition"   "Debtors.Petition" 

levels(insolvencygor.2011Q3$Geography) 
#[1] "East"      "East Midlands"   
#[3] "London"     "North East"    
#[5] "North West"    "South East"    
#[7] "South West"    "Wales"     
#[9] "West Midlands"   "Yorkshire and the Humber" 

#So what next? 

Después de haber conseguido tan lejos, ¿cómo dar el siguiente paso en la generación de un mapa temático/coropletas, que los colores de cada región de acuerdo con el valor Debtors.Petition, por ejemplo?

(también me he dado cuenta de una posible Gotcha - hay una falta de coincidencia en los niveles GOR de capitalización: "Yorkshire y Humber" y "Yorkshire y Humber")

+0

Parece que [esta publicación de SO] (http://stackoverflow.com/questions/1260965/developing-geographic-thematic-maps-with-r) (el primero en la lista "Relacionado" en la barra lateral derecha) podría ayudarlo a lograr el resto del camino. –

+0

Vi eso, pero perdí la solución las primeras dos veces ... Entonces, ¿qué tengo que hacer es algo así como: \t gor @ data = merge (insolvencygor.2011Q3, gor @ data, by.x = ' Geography ', by.y =' NAME ') plot (gor, col = levels ([email protected]$Creditors.Petition)) aunque con una asignación de color adecuada y mapas de nombre de región correctos (me doy cuenta de que no es solo Yorks y Humberside que no coinciden ...) – psychemedia

+0

¿Podría reducir su conjunto de datos a un pequeño ejemplo que ilustre su problema? Puede guardar estos usando el comando guardar y subirlos a SO o a un servidor y publicar el enlace aquí. Esto reduciría la gran cantidad de código que tiene mucho más fácil. –

Respuesta

1

no haber visto la madera de los árboles, para responder a mi propia pregunta, aquí hay una manera (código continuación de código en la pregunta):

#Convert factors to numeric [ http://stackoverflow.com/questions/4798343/convert-factor-to-integer ] 
#There's probably a much better formulaic way of doing this/automating this? 
insolvencygor.2011Q3$Creditors.Petition=as.numeric(levels(insolvencygor.2011Q3$Creditors.Petition))[insolvencygor.2011Q3$Creditors.Petition] 
insolvencygor.2011Q3$Company.Winding.up.Petition=as.numeric(levels(insolvencygor.2011Q3$Company.Winding.up.Petition))[insolvencygor.2011Q3$Company.Winding.up.Petition] 
insolvencygor.2011Q3$Debtors.Petition=as.numeric(levels(insolvencygor.2011Q3$Debtors.Petition))[insolvencygor.2011Q3$Debtors.Petition] 

#Tweak the levels so they match exactly (really should do this via a lookup table of some sort?) 
i2=insolvencygor.2011Q3 
i2c=c('East of England','East Midlands','Greater London Authority','North East','North West','South East','South West','Wales','West Midlands','Yorkshire and The Humber') 
i2$Geography=factor(i2$Geography,labels=i2c) 

#Merge the data with the shapefile 
[email protected]=merge([email protected],i2,by.x='NAME',by.y='Geography') 

#Plot the data using a greyscale 
plot(gor,col=gray([email protected]$Creditors.Petition/max([email protected]$Creditors.Petition))) 

entonces, ¿qué hace este enfoque es combinar los datos numéricos en el archivo de forma, y ​​luego trazar directamente.

Dicho esto, ¿no sería una forma más limpia mantener separados el archivo de datos y el shapefile? (Todavía no estoy seguro de cómo hacer eso?)

+0

No creo que sea más limpio, y necesita combinar los datos "normales" y espaciales para hacer la trama. –

+0

Y comparto su opinión de que el código podría ser más corto y más directo, pero sin un ejemplo reproducible es difícil de demostrar. –

+0

Reproducible en qué sentido? Agregar el código de respuesta anterior al código en la pregunta genera el mapa temático, aunque es cierto que los pasos de descarga son necesarios como una intervención manual, en lugar de ser manejados por el script. – psychemedia

Cuestiones relacionadas