Pole centric map with Raster?
Hi,
On Mar 27, 2015, at 5:55 PM, Edzer Pebesma <edzer.pebesma at uni-muenster.de> wrote:
On 03/27/2015 10:14 PM, Tim Appelhans wrote:
Ben here's some code I used for a paper. Is this producing what you want?
Cool! The ggplot2 example of Ben looks as if it plots cells that form a rectangular grid in long-lat onto a polar stereographic projection. One could do this by converting the raster to a SpatialPolygonsDataFrame, rgdal::spTransform this to the new projection, and then plot. It might be improved by not plotting the cell (polygon) boundaries.
Yes, in the ggplot2 example the volcano matrix is transformed into a data frame, 'mat', of [lon,lat,z]. I followed this nice post: http://www.numbertheory.nl/2011/11/08/drawing-polar-centered-spatial-maps-using-ggplot2/ I think the following replicates what I did before (less the coastline). I don't know how to control the boundaries in ggplot2. I'll try what you suggest with SpatialPolygonsDataFrame - I would prefer to use just one graphics paradigm, such as lattice/spplot, if possible. Thanks! Ben ### START library(ggplot2) # convert a matrix to data frame as.tile <- function(x = volcano, bb = c(ll.lat = 45, ll.lon = -90, ur.lat = 75, ur.lon = -40) ){ if (!is.matrix(x)) stop("input must be a matrix") d <- dim(x) xx <- rep(seq(from = bb[['ll.lon']], to = bb[['ur.lon']], length = d[2]), each = d[1]) yy <- rep(seq(from = bb[['ll.lat']], to = bb[['ur.lat']], length = d[1]), d[2]) data.frame(lon = xx, lat = yy, z = as.vector(x)) } # custom theme without axes and annotations theme_polar <- function(){ list( theme_bw(base_size=18), theme( axis.text = element_blank(), axis.ticks = element_blank(), legend.position = "none"), labs(x='',y='')) } ylim <- c(30,90) xlim <- c(-180,180) projection <- "azequidist" orientation <- c(90, -30, 0) mat <- as.tile() ggplot() + geom_tile(data = mat, aes(x = lon, y = lat, fill = z)) + coord_map(projection = projection, orientation = orientation, ylim = ylim, xlim = xlim) + scale_x_continuous(breaks=(-6:6) * 30, expand = c(0,0)) + scale_y_continuous(breaks = seq(from = ylim[1], to = ylim[2], by = 15), limits = ylim, expand = c(0,0)) + theme_polar() #### END
library("remote")
###### EXAMPLE I ##########################################################
###########################################################################
library("rworldmap")
library("rgdal")
library("rgeos")
library("gridExtra")
library("RColorBrewer")
## load data
data("vdendool")
data("coastsCoarse")
## calculate 4 leading modes
nh_modes <- eot(x = vdendool, y = NULL, n = 4, reduce.both = FALSE,
standardised = FALSE, verbose = TRUE)
## create coastal outlines
ster <- CRS("+proj=stere +lat_0=90 +lon_0=-45")
xmin <- -180
xmax <- 180
ymin <- 20
ymax <- 90 # Coordinates for bounding box
bb <- cbind(x = c(xmin, xmin, xmax, xmax, xmin),
y = c(ymin, ymax, ymax, ymin, ymin)) #Create bounding box
SP <- SpatialPolygons(list(Polygons(list(Polygon(bb)), "1")),
proj4string = CRS(proj4string(coastsCoarse)))
gI <- gIntersects(coastsCoarse, SP, byid = TRUE)
out <- vector(mode = "list", length = length(which(gI)))
ii <- 1
for (i in seq(along = gI)) if (gI[i]) {
out[[ii]] <- gIntersection(coastsCoarse[i, ], SP)
row.names(out[[ii]]) <- row.names(coastsCoarse)[i]
ii <- ii + 1
}
nh_coasts <- do.call("rbind", out)
nh_coasts_ster <- spTransform(nh_coasts, ster)
lout <- list("sp.lines", nh_coasts_ster,
col = "grey30", grid = TRUE)
## define colours
clrs <- colorRampPalette(rev(brewer.pal(9, "RdBu")))
## project modes to polar stereographic CRS
mode1 <- projectRaster(nh_modes[[1]]@r_predictor, crs = ster)
spplot(mode1, sp.layout = lout,
col.regions = clrs(1000), at = seq(-1, 1, 0.2),
par.settings = list(axis.line = list(col = 0)),
colorkey = list(height = 0.75, width = 1))
Tim
On 27.03.2015 21:20, Ben Tupper wrote:
Hello, I'm learning how to use Raster* objects and ultimately hope to draw rasters from a (north) polar perspective. I can do something like this using tiling in ggplot2: https://dl.dropboxusercontent.com/u/8433654/polar-map-with-matrix.png I have hopes of doing similar using raster, sp and lattice. But I'm drowning in information as neophytes are prone to do. Below is a self-contained example... I'm not getting too far. It creates two plots: raster without using projectRaster: https://dl.dropboxusercontent.com/u/8433654/raster_no_project.png raster using projectRaster: https://dl.dropboxusercontent.com/u/8433654/raster_with_project.png Neither is what I would like. How does one get the map centered on the pole and draw a (warped) raster using spplot? Thanks! Ben ##### START library(raster) library(maps) library(maptools) library(rgdal) # create a Raster from 'volcano' my_proj <- "+proj=stere +lat_0=90 +lon_0=-30 +x_0=0 +y_0=0" r <- raster(volcano, xmn = -90, xmx = 0, ymn = 50, ymx = 85, crs = my_proj) # class : RasterLayer # dimensions : 87, 61, 5307 (nrow, ncol, ncell) # resolution : 1.47541, 0.4022989 (x, y) # extent : -90, 0, 50, 85 (xmin, xmax, ymin, ymax) # coord. ref. : +proj=stere +lat_0=90 +lon_0=-30 +x_0=0 +y_0=0 +ellps=WGS84 # data source : in memory # names : layer # values : 94, 195 (min, max) pr <- projectRaster(r, crs=my_proj) # class : RasterLayer # dimensions : 123, 71, 8733 (nrow, ncol, ncell) # resolution : 1.48, 0.402 (x, y) # extent : -97.4, 7.68, 42.79, 92.236 (xmin, xmax, ymin, ymax) # coord. ref. : +proj=stere +lat_0=90 +lon_0=-30 +x_0=0 +y_0=0 +ellps=WGS84 # data source : in memory # names : layer # values : 93.88372, 194.8761 (min, max) # create a coastline and transform to the projection mp <- map2SpatialLines(map(plot = FALSE, interior = FALSE), proj4string = CRS(my_proj)) mp <- spTransform(mp, CRSobj = CRS(my_proj)) # class : SpatialLines # features : 2904 # extent : -179.9572, 190.2908, -85.44308, 83.57391 (xmin, xmax, ymin, ymax) # coord. ref. : +proj=stere +lat_0=90 +lon_0=-30 +x_0=0 +y_0=0 +ellps=WGS84 # show the map with the 'unprojected' raster plot_r <- spplot(r, sp.layout = list( sp.lines, mp, first = FALSE) ) # show the map with the projected raster plot_pr <- spplot(pr, sp.layout = list( sp.lines, mp, first = FALSE) ) print(plot_r) print(plot_pr) ##### END
sessionInfo()
R version 3.1.2 (2014-10-31) Platform: x86_64-apple-darwin13.4.0 (64-bit) locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rgdal_0.9-2 maptools_0.8-34 maps_2.3-9 raster_2.3-33 sp_1.0-17 loaded via a namespace (and not attached): [1] foreign_0.8-63 grid_3.1.2 lattice_0.20-30 tools_3.1.2 Ben Tupper Bigelow Laboratory for Ocean Sciences 60 Bigelow Drive, P.O. Box 380 East Boothbay, Maine 04544 http://www.bigelow.org
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo
-- Edzer Pebesma Institute for Geoinformatics (ifgi), University of M?nster, Heisenbergstra?e 2, 48149 M?nster, Germany; +49 251 83 33081 Journal of Statistical Software: http://www.jstatsoft.org/ Computers & Geosciences: http://elsevier.com/locate/cageo/ Spatial Statistics Society http://www.spatialstatistics.info
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Ben Tupper Bigelow Laboratory for Ocean Sciences 60 Bigelow Drive, P.O. Box 380 East Boothbay, Maine 04544 http://www.bigelow.org