Merging regions in a map & plotting values
That's actually why I did the second `geom_map` the way I did. Add another column to that data frame and use it for the fill color (preferably using `cut` to bin values ahead of time as it's unlikey you really want to use a continuous color palette.
On Wed, Jan 20, 2016 at 1:55 PM, Joshua Onyango <jaonyango at yahoo.com> wrote:
Hi Bob
Thanks for the help, merging region appear to work now. However still stuck
on the other bit on merging data with spatial object, ("regions") in this
case to be able to plot the data points. I mainly want to plot information
such as % disease prevalence in every region, temperature, flock size etc
Thanks advance
Josh
On Wednesday, 20 January 2016, 1:49, boB Rudis <bob at rudis.net> wrote:
I think this might help you out a bit (it's probably worth taking the
time to look it over as it removes much of the redundant code you
had).
library(sp)
library(maptools)
library(rgeos)
library(rgdal)
library(dplyr)
library(ggplot2)
library(ggthemes)
library(ggalt)
URL <-
"http://census.edina.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip"
fil <- basename(URL)
if (!file.exists(fil)) download.file(URL, fil)
fils <- unzip(fil)
shp <- grep("shp$", fils, value=TRUE)
region <- readOGR(shp, ogrListLayers(shp)[1], stringsAsFactors=FALSE)
# define new regions
region at data$Region <- c("East", "South &S.E", "North", "North", "Midlands",
"North", "SouthWest", "Midlands", "South & S.E")
colnames(region at data) <- c("code", "name","Region")
# dissolve polygons and simplify the shapes
regions <- unionSpatialPolygons(region, region at data$Region)
regions <- gSimplify(regions, 100, topologyPreserve=TRUE)
regions <- gBuffer(regions, byid=TRUE, width=0)
# coord_map and coord_proj will eventually work but this transformation
# will absolutely speed up the calculations
regions <- SpatialPolygonsDataFrame(spTransform(regions,
CRS("+proj=longlat
+ellps=sphere +no_defs")),
data.frame(Region=names(regions),
row.names=names(regions),
stringsAsFactors=FALSE))
eng_map <- fortify(regions, region="Region")
# new projection (good for the UK)
eng_proj <- "+proj=aea +lat_0=54.55635146083455 +lon_0=-3.076171875"
ggplot() +
# base map
geom_map(data=eng_map, map=eng_map,
aes(x=long, y=lat, map_id=id),
color=NA, fill=NA, size=0.5) +
# sample fill of the regions
geom_map(data=data.frame(id=unique(eng_map$id)), map=eng_map,
aes(map_id=id, fill=id),
color="white", size=0.15) +
scale_fill_brewer(palette="Set2") +
coord_proj(eng_proj) +
theme_map()
NOTE: this requires the new ggplot2 (2.0)
On Tue, Jan 19, 2016 at 3:04 PM, Joshua Onyango via R-sig-Geo
<r-sig-geo at r-project.org> wrote:
HelloI'm new into creating maps in R so any help would be great.I have read a few articles on the internet - mainly blogs on mapping in R which I have tried to follow with no much success. Basically I want to merge merge some English regions from 8 to 5 then show information that relates to disease prevalence, temperature etc Here is what I have tried but sound like this cant run due to computer memory or must be doing following a wrong approach.
#Getting theshapefile into working directory
download.file("http://census.edina.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip",
destfile ="lad-region-lookup.zip")> #inzipping theshapefile
folder
unzip("lad-region-lookup.zip", exdir = ".")
#reading theshapefile in r
region <-readOGR(".", "England_gor_2011")
OGR data source withdriver: ESRI Shapefile Source:".", layer: "England_gor_2011" with 9 features It has 2 fields
# Check theshapefile has loaded correctly
plot(region)
lu <-data.frame()
lu <-rbind(lu, region at data)
lu$CODE <-as.character(lu$CODE)
lu$NAME <-as.character(lu$NAME)
lu$Region <-NA
name=c("East", "South
&S.E","North","North","Midlands","North","SouthWest","Midlands","South &
S.E")
lu$Region <-name
# Merge lu(LookUp) into polygons,
region at data$CODE<- as.character(region at data$CODE)
region at data<- full_join(region at data, lu, by = "CODE")
# Tidy mergeddata
region at data<- select(region at data, -NAME.x)
colnames(region at data) <- c("code", "name","Region")
# Ensureshapefile row.names and polygon IDs are sensible
row.names(region) <- row.names(region at data)
region <-spChFIDs(region, row.names(region))
# Now thedissolve
region <-gUnaryUnion(region, id = region at data$Region)
# If you want torecreate an object with a data frame
# make sure row namesmatch
row.names(region) <- as.character(1:length(region))
# Extract thedata you want (the larger geography)
lu <-unique(lu$Region)
lu <-as.data.frame(lu)
colnames(lu)<- "Region" # your datawill probably have more than 1 row!
# And add thedata back in
region <-SpatialPolygonsDataFrame(region, lu)
region2 <-merge(region at data, data, by="Region")
dat2=fortify(region,region="Region")
names(dat2)[names(dat2)=="id"]<-"Region"
dat <-merge(dat2, region2, by="Region")
Error: cannotallocate vector of size 904.9 Mb
In addition:Warning messages:
1: In`[.data.frame`(x, c(m$xi, if (all.x) m$x.alone),
c(by.x,seq_len(ncx)[-by.x]), :
Reached total allocation of 4016Mb: seehelp(memory.size)
Any simpler approach will be highly appreciated.
Thanks
Josh
[[alternative HTML version deleted]]
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo