## Matrix rotation for image and contour plots in R

Say we wish to plot a matrix object in **R** using common functions like `image`

, `contour`

, or `filled.contour`

, or perhaps using a related plotting function such as `image.plot`

from the fields package. Many **R** functions whose outputs include matrices which are intended to be plotted with the above functions are typically written with a certain convention in mind.

That is, these plotting functions which work on matrix objects interpret the matrix `z`

as a table of `f(x[i], y[j])`

. This means that for an n x m matrix, the x axis of the plot will correspond to the rows of the matrix, left to right from rows 1 to n, and the y axis to columns. Further, columns 1 to m go from the bottom row to the top row. This represents a 90 degree counter-clockwise rotation of how we conventionally think of a matrix, rows by columns, top to bottom and left to right, respectively.

So if we create a matrix ourselves, we typically do it the “normal” way rather than follow this programmatic convention. As a result, a simple `image`

plot reveals the classic sideways picture. In these cases we have to rotate our matrix 90 degrees clockwise in anticipation of this odd display. An efficient, quick and concise example of how to do this is with the following function:

f <- function(m) t(m)[,nrow(m):1] mat <- matrix(1:25,5,5) # Example mat[4:5,4:5] <- 100 mat # original matrix f(mat) # rotation achieved by our function

We want our plot to be similarly oriented, but initially it is not. The quarter turn in advance, allows us to plot with the desired orientation:

`image(mat)`

on the left and `image(f(mat))`

on the right

Also, we don’t need to formally define a function to do this. We can simply redefine our matrix:

`m <- t(m)[,nrow(m):1]`

and be done with it. But the function is nice if you anticipate doing this a bunch of times to different matrix objects.

To achieve the 90 degree clockwise rotation, all we do is transpose our matrix and then flip the columns. (Note that the reversed column numbers begin with `n`

because m refers to the original matrix but the operation is carried out after m has been transposed.)*row*

I often use the `image.plot`

function from the fields package because I like the control it gives me over plot formatting. I find it preferable to both the basic `image`

function and the plot function for rasterLayer objects from the raster package. If I am working with a raster layer and I extract the values as a matrix object, the matrix retains the standard orientation. This is another case where plotting the matrix object will require it first be rotated.

Thanks, for this hint!

I’m happy to found that someone else also ‘conventionally think of a matrix’ similar to me… Thanks for your post!

thanks so much for this, its really helpful. doesn’t seem to fit the convention for the function heatmap() though… >< but works fine for image()