Skip to content

how to plot a map on a non-rectilinear grid

3 messages · Costas Douvis, Roger Bivand, Javier Garcia-Pintado

#
Hi everyone

I have a matrix (let's say that it contains the values of elevation) and
want to plot its values on a map using a function such as image.plot or
filled.contour. The problem is that my grid is not rectilinear, it is
bended. Here is an example

lon<-matrix(0,20,25)
lat<-matrix(0,20,25)
elev<-matrix(0,20,25)
for (i in 1:20) {
for (j in 1:25) {
  lat[i,j]<-i+((j-12.5)^2)/100
  lon[i,j]<-j+((i-10)^2)/100
  elev[i,j]<-i+j
  }
  }

All 3 matrices have dimensions 20x25. How can I plot elev values in the
grid points defined by lat and lon?
#
Costas Douvis <cdouvis <at> geol.uoa.gr> writes:
(example removed)
You can flatten all three to triplets of (x, y, z) values, and colour-code 
the points, which, as you say, do not form a grid. image() and friends 
require either a matrix treated as a grid, or a list with the x and y 
margins and z as a matrix.

Since these are not in a regular grid, the usual approach is to interpolate,
perhaps using interp() in the akima package, or using other methods of your
choice, so that you can plot the interpolated values on a regular grid.

If you are considering plotting a grid with data based on geographical
coordinates on a map in projected coordinates, the input rectangular 
cells can be projected, using object classes defined in the sp package,
and functions provided in the same package, with projection using 
spTransform() methods in the rgdal package.

Perhaps the R-sig-geo list would be more suited to your question?

Roger Bivand
#
There is another solution, which depending on the resolution and amount of
your data may be useful. You can find through interpolation the corners of
four coordinates around any data point that define a four sides polygon.
This grid so created does not need to be regular. Then, you can simple
call polygon() to draw each polygon whose color corresponds to the value
in related data set. This has worked perfectly for me.
regards,
Javier