flipmap <- function(lon,lat,data,dimension="lat") { # Flip a two-dimensional map (matrix) or a three-dimensional array up side down, # i.e. first line becomes last, last line becomes first and so on. In other # words, flip either latitude or longitude or both dimensions of a map or a # three-dimensional array (field), with first two space dimensions p for # longitude and q for latitude, and third n time dimension. # # Description: # # Returns a flipped map (matrix) or three-dimensional array # # Usage: # # flipmap(lon,lat,data,dimension) # # Arguments: # # lon: vector of longitudes # # lat: vector of latitudes # # data: A two-dimensional map (matrix) or three-dimensional array of data # values. If data is a matrix, it must # have the structure of longitude for columns and latitude for # rows. If data is a three-dimensional array, it must have the # longitude as the first dimension, latitude as the second # dimension and time as the third dimension # # dimension: A string indicating which dimension(s) will be flipped. # It must be either "lat" (default), "lon" or "both" # # # Output: # # $out: flipped map (matrix) or three-dimensional array # # $lon: longitude vector (flipped appropriately if necessary) # # $lat: latitude vector (flipped appropriately if necessary) # # Details: # # A matrix or array is flipped into a format suitable for plotting. # # Author: # # Dag Johan Steinskog 25 October 2005 # Caio Coelho # Chris Ferro # # Examples: # # #Flip a map (matrix) # x <- array(1:8,dim=c(2,4)) # lon <- seq(50,110,20) # lat <- seq(-10,10,20) # flipmap(lon,lat,x)$out # Defaults flips lat # flipmap(lon,lat,x)$lat # flipmap(lon,lat,x)$lon # flipmap(lon,lat,x,"lon")$out # flipmap(lon,lat,x,"both")$out # # #Flip a three-dimensional array # y <- array(1:8,dim=c(2,2,2)) # lonnew <- seq(50,70,20) # latnew <- seq(-10,10,20) # flipmap(lonnew,latnew,y)$out # Defaults flips lat # flipmap(lonnew,latnew,y)$lat # flipmap(lonnew,latnew,y)$lon # flipmap(lonnew,latnew,y,"lon")$out # flipmap(lonnew,latnew,y,"both")$out index<-NULL if(length(dim(data))==2){ if(dimension == "lon") {flip <- c(F,T)} if(dimension == "lat") {flip <- c(T,F)} if(dimension == "both") {flip <- c(T,T)} for (i in 1:length(dim(data))){ index[[i]] <- 1:dim(data)[i] if (flip[i]) {index[[i]] <- rev(index[[i]])} } out<-data[index[[1]],index[[2]]] lon<-lon[index[[2]]] lat<-lat[index[[1]]] } if(length(dim(data))==3){ if(dimension == "lon") {flip <- c(F,T,F)} if(dimension == "lat") {flip <- c(T,F,F)} if(dimension == "both") {flip <- c(T,T,F)} for (i in 1:length(dim(data))){ index[[i]] <- 1:dim(data)[i] if (flip[i]) {index[[i]] <- rev(index[[i]])} } out<-data[index[[1]],index[[2]],index[[3]]] lon<-lon[index[[2]]] lat<-lat[index[[1]]] } invisible(list(lon=lon,lat=lat,out=out)) }