Hadley As you can tell from the final example, I really appreciate the look and feel of ggplot2 and use it for most of my non-map plots. However, I have, maybe wrongly, presumed fortify only works for spatial polygons and lines. I often have a need to map spatial points, pixels or grids and so have stuck with spplot for most of my mapping.
cheers Josh On Dec 9, 2010, at 3:36 PM, Hadley Wickham wrote: > ggplot2 + coord_map() already does graticules in a similar manner, as > far as I can tell. > > Hadley > > On Thu, Dec 9, 2010 at 2:22 PM, Pierre Roudier <pierre.roud...@gmail.com> > wrote: >> That really is a neat piece of code. Very interested - the result >> looks very much like a ggplot2 plot, which I'm a big fan. >> >> Cheers, >> >> Pierre >> >> 2010/12/9 Josh London <josh.lon...@noaa.gov>: >>> Hello >>> >>> One of the features I often find myself wanting within spplot is the >>> ability to produce graticules (with corresponding axis labels) that >>> represent latitude/longitude lines for projected data. I often find myself >>> searching the R archives and google for examples and methods for >>> accomplishing this, but have always come up empty. >>> >>> This has been partially possible by using the gridlines() function within >>> sp and then projecting those spatial lines to the desired projection. There >>> are two drawbacks to this solution: >>> >>> 1) Often the extent of the projected gridlines is smaller than the data of >>> interest so the lines stop short of the plot borders >>> >>> 2) There is no documented method I've found for producing the axis labels >>> with degree units for each of the gridlines. gridat() is close but only >>> supports unprojected data >>> >>> So, I ventured forth and pulled together a few functions that attempt to >>> provide a generalized solution in the hopes that a) there's not some >>> existing, obvious, solution my endless searching has overlooked and b) >>> other folks could take advantage of it and maybe expand/improve on it. >>> >>> I've pulled everything together in a draft package, ProjectedGridlines, and >>> it is available on GitHub (https://github.com/jmlondon/ProjectedGridlines). >>> I've got some basic draft documentation in there for those interested. >>> >>> I make no claims to the code being elegant or an approach that will work >>> for everyone. The main purpose here was to get something that works and >>> distribute it. >>> >>> Below, I include the three functions and a reproducible example based on >>> the north carolina dataset included with the maptools package. I've copied >>> over some of the roxygen documentation, but those interested in more >>> details should check the files on GitHub. >>> >>> Cheers >>> Josh >>> >>> GetGratLines<-function(spobj,proj_str,exp_deg,ndisc=500,...){ >>> sp...@bbox[1,1]<-sp...@bbox[1,1]+exp_deg$l >>> sp...@bbox[1,2]<-sp...@bbox[1,2]+exp_deg$r >>> sp...@bbox[2,1]<-sp...@bbox[2,1]+exp_deg$b >>> sp...@bbox[2,2]<-sp...@bbox[2,2]+exp_deg$t >>> gl<-spTransform(gridlines(spobj,ndisc=ndisc,...),CRS(proj_str)) >>> return(gl) >>> } >>> >>> #' @param spobj an unrpojected sp object that is the basis of the final >>> projected outcome >>> #' @param proj_str a proj4 string specifying the desired projection >>> #' @param exp_deg is a named list with values l,r,b,t specifying the amount >>> in decimal >>> #' degrees each side (left, right, bottom, top) should be expanded to >>> account for differences >>> #' in extent between the projected gridlines and the final projected extent >>> of spobj >>> #' @param ... passing of parameters relevant to gridlines() >>> >>> GetDegreeLabels<-function(spobj){ >>> ewl<-coordinates(gridlines(spobj)["EW"]...@lines[[1]]) >>> nsl<-coordinates(gridlines(spobj)["NS"]...@lines[[1]]) >>> ewLabels<-lapply(ewl,function(x) {return(x[1,1])}) >>> nsLabels<-lapply(nsl,function(x) {return(x[1,2])}) >>> return(list(EW_Labels=unlist(ewLabels),NS_Labels=unlist(nsLabels))) >>> } >>> >>> #' @param spobj an unrpojected sp object that is the basis of the final >>> projected outcome >>> >>> GetLabelCoords<-function(gl,offset=list(ew=0,ns=0)){ >>> ewc<-coordinates(gl["EW"]...@lines[[1]]) >>> nsc<-coordinates(gl["NS"]...@lines[[1]]) >>> ewCoords<-lapply(ewc,function(x) {return(x[1,1])}) >>> nsCoords<-lapply(nsc,function(x) {return(x[1,2])}) >>> ewCoords<-lapply(ewCoords,function(x) {return(x+offset$ew)}) >>> nsCoords<-lapply(nsCoords,function(x) {return(x+offset$ns)}) >>> return(list(EW_Coords=unlist(ewCoords),NS_Coords=unlist(nsCoords))) >>> } >>> >>> #' @param gl the SpatialLines object returned from GetGratLines >>> #' @param offset a named list with values ew and ns specifying an offset >>> for all labels on the axis >>> >>> And an example: >>> >>> library(sp) >>> library(rgdal) >>> library(maptools) >>> library(RColorBrewer) >>> >>> #read in the maptools north carolina shapefile, unprojected >>> d <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], >>> proj4string=CRS("+proj=longlat +datum=NAD27")) >>> >>> # create a dummy factor variable, with equal labels: >>> set.seed(31) >>> d$f = factor(sample(1:5,100,replace=T),labels=letters[1:5]) >>> >>> #specify a custom Albers equal centered on the coordinate data >>> #this works for points and polygons, but lines need to be converted to >>> points >>> med.lat <- round(median(coordinates(d)[,2])) >>> med.lon <- round(median(coordinates(d)[,1])) >>> lat1<-bbox(d)[2,1]+diff(range(bbox(d)[2,]))/3 >>> lat2<-bbox(d)[2,2]-diff(range(bbox(d)[2,]))/3 >>> >>> myProj <- paste("+proj=aea +lat_1=",lat1," +lat_2=",lat2," +lat_0=",med.lat, >>> " +lon_0=", med.lon, "+x_0=0 +y_0=0 +ellps=GRS80 >>> +datum=NAD83 +units=m",sep="") >>> >>> #project the data, the graticule lines. note the gridlines function calls >>> the unprojected data >>> d.proj <- spTransform(d,CRS(myProj)) >>> #grat.lines<-spTransform(gridlines(d,ndisc=500),CRS(myProj)) >>> g<-GetGratLines(d,myProj,list(t=0.25,b=-0.25,l=-0.25,r=0.25)) >>> #create the sp.layout component for the graticule lines >>> grat.plot<-list("sp.lines",g,lwd="1.5",col="white",first=TRUE) >>> >>> x_grat_at<-GetLabelCoords(g,offset=list(ew=0))$EW_Coords >>> >>> y_grat_at<-GetLabelCoords(g,offset=list(ns=0))$NS_Coords >>> >>> x_grat<-list(draw=TRUE, >>> at=x_grat_at, >>> labels=as.character(GetDegreeLabels(d)$EW_Labels), >>> tck=c(0,0), >>> cex=0.75) >>> >>> y_grat<-list(draw=TRUE, >>> at=y_grat_at, >>> labels=as.character(GetDegreeLabels(d)$NS_Labels), >>> rot=90, >>> tck=c(0,0), >>> cex=0.75) >>> >>> spplot(d.proj, c("f"), >>> panel=function(...){ >>> panel.fill(col="gray90") >>> panel.polygonsplot(...) >>> }, >>> sp.layout=list(grat.plot), >>> col.regions=brewer.pal(5, >>> "Set3"),scales=list(x=x_grat,y=y_grat)) >>> >>> >>> >>> >>> >>> [[alternative HTML version deleted]] >>> >>> _______________________________________________ >>> R-sig-Geo mailing list >>> R-sig-Geo@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo >>> >> >> _______________________________________________ >> R-sig-Geo mailing list >> R-sig-Geo@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-sig-geo >> > > > > -- > Assistant Professor / Dobelman Family Junior Chair > Department of Statistics / Rice University > http://had.co.nz/ _______________________________________________ R-sig-Geo mailing list R-sig-Geo@r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo