[R-sig-Geo] Merging regions in a map & plotting values

boB Rudis bob at rudis.net
Fri Jan 22 18:47:01 CET 2016


You really don't want to bind the data to the regions. My example
showed how to use a separate data frame. I won't have time to provide
an even simpler example until the weekend and (I realize this is list
anathema) this would work alot better as a Stack Overflow question.

On Fri, Jan 22, 2016 at 12:32 PM, Joshua Onyango <jaonyango at yahoo.com> wrote:
> Hi Bob,
>
> Still getting the memory error to do with memory after merging the data to
> plot points as per your suggestions.
>
> What could I be doing wrong is is there a way out to fix this?
>
> Thanks
>
> dat_merge = merge(regions,orf_data,by="Region",duplicateGeoms=TRUE)
> eng_map <- fortify(regions, region="Region")
> names(eng_map)[names(eng_map)=="id"]<-"Region"
> big_eng = merge(dat_merge, eng_map,by = "Region",duplicateGeoms=TRUE)
>
> Error: cannot allocate vector of size 903.8 Mb
>
>
> On Wednesday, 20 January 2016, 19:14, boB Rudis <bob at rudis.net> wrote:
>
>
> 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
>>
>>
>
>



More information about the R-sig-Geo mailing list