For SpatialPoints* and SpatialPixels* I'm using ggplot2: library(sp) library(ggplot2)
data(meuse) data(meuse.grid) coordinates(meuse) <- ~x+y coordinates(meuse.grid) <- ~x+y # ... some spatial processing plot_meuse <- ggplot(as.data.frame(meuse)) + geom_point(aes(x,y, colour=zinc)) + coord_equal() plot_meuse.grid <- ggplot(as.data.frame(meuse.grid)) + geom_tile(aes(x,y, fill=dist)) + coord_equal() # You can alo combine both geoms plot_combined <- ggplot() + geom_tile(data=as.data.frame(meuse.grid), aes(x,y, fill=factor(soil))) + geom_point(data=as.data.frame(meuse), aes(x,y, colour=zinc)) + coord_equal() HTH, Pierre 2010/12/14 Josh London <josh.lon...@noaa.gov>: > 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