[R-sig-Geo] Summary: how to plot several raster layers on the same page and with the same color scale

Agustin Lobo alobolistas at gmail.com
Wed Jul 6 14:00:13 CEST 2011


I summarize here the different solutions I got to my question regarding
how to plot several raster layers on the same page and with the same
color scale.
Sorry it took a long time, I was interrupted by something else for weeks.
Hope this is useful.
Many thanks to all.


require(raster)
require(ggplot2)
require(plotrix)
require(rasterVis)
require(lattice)

foo1 <- foo2 <- foo3<- foo4 <- raster(nrows=20, ncols=20)
values(foo1) <- runif(400,-100.100)
values(foo2) <- runif(400,-150,100)
values(foo3) <- runif(400,0,50)
values(foo4) <- runif(400,-100,150)
extent(foo1) = extent(foo2) = extent(foo3) = extent(foo4) = extent(c(0,20,0,20))


#Based on comment by Jeremy Raw and Andy.Bunn at wwu.edu
par(mfrow=c(2,2))
plot(foo1,col=rev(heat.colors(32)),zlim=c(-150,150))
plot(foo2,col=rev(heat.colors(32)),zlim=c(-150,150))
plot(foo3,col=rev(heat.colors(32)),zlim=c(-150,150))
plot(foo4,col=rev(heat.colors(32)),zlim=c(-150,150))

#Note by ALOBO: simplest solution

#Based on comment by Adam Sparks
require(plotrix)
minValue = -150
maxValue = 150
colstep=10
brk = c(minValue, maxValue, by = colstep)
brk = seq(minValue, maxValue, by = colstep)
par(mfrow=c(2,2))
plot(foo1, breaks = brk, col = rev(heat.colors(30)), axes = FALSE,
xlab = '', ylab = '', legend = FALSE)
color.legend(xl=20.5,yb=1,xr=21.5,yt=18, legend = seq(minValue,
maxValue, by = 3*colstep),
  rect.col = rev(heat.colors(30)),pos=4,gradient="y",cex=0.55,offset=2,
col="black")
plot(foo2, breaks = brk, col = rev(heat.colors(30)),legend = FALSE,
xlab = '', ylab = '',)
color.legend(xl=20.5,yb=1,xr=21.5,yt=18, legend = seq(minValue,
maxValue, by = 3*colstep),
  rect.col = rev(heat.colors(30)),pos=4,gradient="y",cex=0.55,offset=2,
col="black")
plot(foo3, breaks = brk, col = rev(heat.colors(30)),legend = FALSE,
xlab = '', ylab = '',)
color.legend(xl=20.5,yb=1,xr=21.5,yt=18, legend = seq(minValue,
maxValue, by = 3*colstep),
  rect.col = rev(heat.colors(30)),pos=4,gradient="y",cex=0.55,offset=2,
col="black")
plot(foo3, breaks = brk, col = rev(heat.colors(30)),legend = FALSE,
xlab = '', ylab = '',)
color.legend(xl=20.5,yb=1,xr=21.5,yt=18, legend = seq(minValue,
maxValue, by = 3*colstep),
  rect.col = rev(heat.colors(30)),pos=4,gradient="y",cex=0.55,offset=2,
col="black")


#Note by ALOBO: in practice, you must use hist() to determine
meaningful min and max values in both cases


#Based on comment by  paul.hiemstra at knmi.nl
library(ggplot2)
library(raster)
theme_set(theme_bw())

r = foo1

# Convert to data.frame
r_df = as.data.frame(as(r, 'SpatialPixelsDataFrame'))
print(str(r_df))
# create new column 10 times larger
# here you could extract data from other grids that
# you want to show at the same time
r_df$foo2 = values(foo2)
r_df$foo3 = values(foo3)
r_df$foo4 = values(foo4)

print(str(r_df))

# Reshape the data for ggplot
plotData = melt(r_df, id.vars = c('x','y'))

ggplot(aes(x = x, y = y), data = plotData) +
    geom_tile(aes(fill = value)) + facet_wrap(~ variable) +
    scale_fill_gradient(low = 'white', high = 'blue') +
    coord_equal()

#Note by ALOBO: while this is the most aesthetic solution, would it
work for large raster objects?


#Based on comment by Robert Hijmans:
#Requires raster version >= 1.8-33 and rasterVis

s <- stack(foo1,foo2, foo3,foo4)
spplot(s)
theme_set(theme_bw())
gplot(s) + geom_tile(aes(fill = value)) + facet_wrap(~ variable) +
           scale_fill_gradient(low = 'white', high = 'blue') + coord_equal()

#Note by ALOBO: assumed it automatically makes a sampleRegular() for
large raster objects?
#In such a case, it would combine aesthetic and performance



More information about the R-sig-Geo mailing list