joepvanderzanden
2011-Feb-20 23:59 UTC
[R] Same color key for multiple lattice contour plots
Hi all, I'm trying to make multiple lattice contour plots which have the same color key, to allow good comparisons. However, I run into some problems when fitting the plots to the color key. Basically my strategy to tackle this problem was: 1) define a color key for all plots; 2) calculate the variable range for each plot; 3) calculate the range of colors from the color key that correspond with the variable range in each plot. This works fine for one plot but gives problems for an other. The code is shown below. Any ideas of how to solve this would be very welcome! Thanks in advance, Joep van der Zanden MSc student Hydrology and Water Quality Wageningen University, The Netherlands / University of Sydney, Australia # variable to plot: groundwater heads for 2 situations (L Med Clay Grass; S Clay Loam Trees): z2 and z1 # x: range of distances to river # y: range of lambda values ## define input data x <- vector(mode="numeric", length=64) for(i in 1:8){x[((i-1)*8+1):(i*8)]<- c(0,25,65,140,240,390,590,840)} y <- vector(mode="numeric", length=64) for(i in 1:8){y[((i-1)*8+1):(i*8)]<- c(.1,.2,.3,.4,.5,.6,.7,.8)[i]} #Groundwater heads L Med Clay Grass: z1<-c(-2.500000,-2.505624,-2.518618,-2.545173,-2.573554,-2.602523,-2.618828,-2.626615, -2.500000,-2.605805,-2.753376,-2.975772,-3.176528,-3.384182,-3.522155,-3.600701, -2.500000,-2.665630,-2.899457,-3.264895,-3.622645,-4.027824,-4.344277,-4.552091, -2.500000,-2.681250,-2.937271,-3.338646,-3.736416,-4.193448,-4.559524,-4.805040, -2.500000,-2.704198,-2.995056,-3.458425,-3.932201,-4.493279,-4.964342,-5.291613, -2.500000,-2.714743,-3.021087,-3.511101,-4.015649,-4.616914,-5.126386,-5.482788, -2.500000,-2.714741,-3.021320,-3.512125,-4.018124,-4.621621,-5.133251,-5.491187, -2.500000,-2.714734,-3.021383,-3.512441,-4.018981,-4.623628,-5.137014,-5.496542) #Groundwater heads S Clay Loam Trees: z2<-c(-3.000098,-3.097126,-3.239426,-3.473582,-3.721368,-4.020646,-4.277272,-4.457723, -3.000100,-3.107293,-3.263420,-3.518309,-3.786358,-4.109567,-4.386844,-4.582058, -3.000100,-3.110692,-3.271133,-3.531996,-3.805475,-4.134907,-4.417481,-4.616469, -3.000100,-3.110448,-3.270550,-3.531059,-3.804453,-4.134001,-4.416834,-4.616037, -3.000100,-3.111242,-3.272157,-3.533380,-3.806871,-4.136071,-4.418223,-4.616824, -3.000100,-3.110467,-3.270084,-3.528994,-3.799932,-4.125979,-4.405361,-4.601977, -3.000100,-3.110983,-3.271263,-3.531276,-3.803556,-4.131419,-4.412594,-4.610585, -3.000100,-3.111398,-3.272309,-3.533291,-3.806408,-4.135115,-4.416826,-4.615104) ##step 1 define color key bynumb <- .2 # delta deltaseq <- seq(-5.8,-2,by=bynumb) # define color key numbcolstotal <- length(deltaseq)-1 # number of colors in color key #define plot for L Med Clay Grass: x.marginal <- seq(min(x), max(x), length.out = 50) y.marginal <- seq(min(y), max(y), length.out = 50) xy.marginal <- list(x = x.marginal, y = y.marginal) zz <- loess((z1) ~ x * y) grid <- expand.grid(xy.marginal) grid[, "fit"] <- c(predict(zz, grid)) # step 2 calculate the range of groundwater heads for this plot: rangehere<-seq(floor(min(z1)/bynumb)*bynumb,ceiling(max(z1)/bynumb)*bynumb,by=bynumb) # rangehere appears to be seq(-5.6, -2.4, by = -.2, length = 17) # step 3 calculate the range of colors that fit to the range of groundwater heads colorrange<-round(seq(((rangehere[1]-deltaseq[1])/bynumb)+1,((max(rangehere)-deltaseq[1])/bynumb),1)) # colorrange is 1 to 16 --> should be correct. plot1 <- contourplot(fit~x*y, data = grid,cuts length(colorrange)-2,region=TRUE, col.regions=rev(rainbow(n=numbcolstotal))[colorrange], colorkey=list(col=rev(rainbow(n=numbcolstotal)),at=deltaseq,labels=list(at=deltaseq)), xlab="distance to river (m)", ylab="lambda (/d)", main="Mean Z, L Med Clay, Grass") ## do the same for S Clay Loam Trees. x.marginal <- seq(min(x), max(x), length.out = 50) y.marginal <- seq(min(y), max(y), length.out = 50) xy.marginal <- list(x = x.marginal, y = y.marginal) zz <- loess((z2) ~ x * y) grid <- expand.grid(xy.marginal) grid[, "fit"] <- c(predict(zz, grid)) # step 2 rangehere<-seq(floor(min(z2)/bynumb)*bynumb,ceiling(max(z2)/bynumb)*bynumb,by=bynumb) # step 3 colorrange<-round(seq(((rangehere[1]-deltaseq[1])/bynumb)+1,((max(rangehere)-deltaseq[1])/bynumb),1)) plot2 <- contourplot(fit~x*y, data = grid,cuts length(colorrange)-2,region=TRUE, col.regions=rev(rainbow(n=numbcolstotal))[colorrange], colorkey=list(col=rev(rainbow(n=numbcolstotal)),at=deltaseq,labels=list(at=deltaseq)), xlab="distance to river (m)", ylab="lambda (/d)", main="Mean Z, S Clay Loam, Trees") print(plot1, position=c(0, 0.5, 1, 1), more=TRUE) print(plot2, position=c(0,0,1,0.5)) # --> second plot is OK, first one not... -- View this message in context: http://r.789695.n4.nabble.com/Same-color-key-for-multiple-lattice-contour-plots-tp3316654p3316654.html Sent from the R help mailing list archive at Nabble.com.
Deepayan Sarkar
2011-Mar-07 09:16 UTC
[R] Same color key for multiple lattice contour plots
On Mon, Feb 21, 2011 at 5:29 AM, joepvanderzanden <joep_vd_zanden at hotmail.com> wrote:> > Hi all, > > I'm trying to make multiple lattice contour plots which have the same color > key, to allow good comparisons. However, I run into some problems when > fitting the plots to the color key. Basically my strategy to tackle this > problem was: > 1) define a color key for all plots; > 2) calculate the variable range for each plot; > 3) calculate the range of colors from the color key that correspond with the > variable range in each plot. > > This works fine for one plot but gives problems for an other. The code is > shown below. Any ideas of how to solve this would be very welcome!I think you are misunderstanding what 'cuts' does. SInce you are plotting on the same x-y grid, why not do it together in a single plot, as is more natural? If I understand your attempts, that's what you seem to be trying to do anyway in a roundabout way. For example, x.marginal <- seq(min(x), max(x), length.out = 50) y.marginal <- seq(min(y), max(y), length.out = 50) xy.marginal <- list(x = x.marginal, y = y.marginal) zz1 <- loess((z1) ~ x * y) zz2 <- loess((z2) ~ x * y) grid <- expand.grid(xy.marginal) grid[, "fit1"] <- c(predict(zz1, grid)) grid[, "fit2"] <- c(predict(zz2, grid)) contourplot(fit1 + fit2 ~ x * y, data = grid, layout = c(1, 2), as.table = TRUE, at = deltaseq, region = TRUE, col.regions = rev(rainbow(n = numbcolstotal - 2)), colorkey = list(at = deltaseq, labels=list(at=deltaseq)), xlab="distance to river (m)", ylab="lambda (/d)", strip = strip.custom(factor.levels = c("Mean Z, L Med Clay, Grass", "Mean Z, L Med Clay, Grass"))) -Deepayan> > Thanks in advance, > > Joep van der Zanden > MSc student Hydrology and Water Quality > Wageningen University, The Netherlands / University of Sydney, Australia > > > # variable to plot: groundwater heads for 2 situations (L Med Clay Grass; S > Clay Loam Trees): z2 and z1 > # x: range of distances to river > # y: range of lambda values > > ## define input data > x <- vector(mode="numeric", length=64) > for(i in 1:8){x[((i-1)*8+1):(i*8)]<- c(0,25,65,140,240,390,590,840)} > y <- vector(mode="numeric", length=64) > for(i in 1:8){y[((i-1)*8+1):(i*8)]<- c(.1,.2,.3,.4,.5,.6,.7,.8)[i]} > > #Groundwater heads L Med Clay Grass: > z1<-c(-2.500000,-2.505624,-2.518618,-2.545173,-2.573554,-2.602523,-2.618828,-2.626615, > > -2.500000,-2.605805,-2.753376,-2.975772,-3.176528,-3.384182,-3.522155,-3.600701, > > -2.500000,-2.665630,-2.899457,-3.264895,-3.622645,-4.027824,-4.344277,-4.552091, > > -2.500000,-2.681250,-2.937271,-3.338646,-3.736416,-4.193448,-4.559524,-4.805040, > > -2.500000,-2.704198,-2.995056,-3.458425,-3.932201,-4.493279,-4.964342,-5.291613, > > -2.500000,-2.714743,-3.021087,-3.511101,-4.015649,-4.616914,-5.126386,-5.482788, > > -2.500000,-2.714741,-3.021320,-3.512125,-4.018124,-4.621621,-5.133251,-5.491187, > > -2.500000,-2.714734,-3.021383,-3.512441,-4.018981,-4.623628,-5.137014,-5.496542) > > #Groundwater heads S Clay Loam Trees: > z2<-c(-3.000098,-3.097126,-3.239426,-3.473582,-3.721368,-4.020646,-4.277272,-4.457723, > > -3.000100,-3.107293,-3.263420,-3.518309,-3.786358,-4.109567,-4.386844,-4.582058, > > -3.000100,-3.110692,-3.271133,-3.531996,-3.805475,-4.134907,-4.417481,-4.616469, > > -3.000100,-3.110448,-3.270550,-3.531059,-3.804453,-4.134001,-4.416834,-4.616037, > > -3.000100,-3.111242,-3.272157,-3.533380,-3.806871,-4.136071,-4.418223,-4.616824, > > -3.000100,-3.110467,-3.270084,-3.528994,-3.799932,-4.125979,-4.405361,-4.601977, > > -3.000100,-3.110983,-3.271263,-3.531276,-3.803556,-4.131419,-4.412594,-4.610585, > > -3.000100,-3.111398,-3.272309,-3.533291,-3.806408,-4.135115,-4.416826,-4.615104) > > > ##step 1 define color key > bynumb <- .2 # delta > deltaseq <- seq(-5.8,-2,by=bynumb) # define color key > numbcolstotal <- length(deltaseq)-1 # number of colors in color key > > > #define plot for L Med Clay Grass: > x.marginal <- seq(min(x), max(x), length.out = 50) > y.marginal <- seq(min(y), max(y), length.out = 50) > xy.marginal <- list(x = x.marginal, y = y.marginal) > zz <- loess((z1) ~ x * y) > grid <- expand.grid(xy.marginal) > grid[, "fit"] <- c(predict(zz, grid)) > > ?# step 2 calculate the range of groundwater heads for this plot: > rangehere<-seq(floor(min(z1)/bynumb)*bynumb,ceiling(max(z1)/bynumb)*bynumb,by=bynumb) > ?# rangehere appears to be seq(-5.6, -2.4, by = -.2, length = 17) > ?# step 3 calculate the range of colors that fit to the range of groundwater > heads > colorrange<-round(seq(((rangehere[1]-deltaseq[1])/bynumb)+1,((max(rangehere)-deltaseq[1])/bynumb),1)) > ?# colorrange is 1 to 16 --> should be correct. > > plot1 <- contourplot(fit~x*y, data = grid,cuts > length(colorrange)-2,region=TRUE, > ? ?col.regions=rev(rainbow(n=numbcolstotal))[colorrange], > > colorkey=list(col=rev(rainbow(n=numbcolstotal)),at=deltaseq,labels=list(at=deltaseq)), > ? ?xlab="distance to river (m)", ylab="lambda (/d)", main="Mean Z, L Med > Clay, Grass") > > ## do the same for S Clay Loam Trees. > x.marginal <- seq(min(x), max(x), length.out = 50) > y.marginal <- seq(min(y), max(y), length.out = 50) > xy.marginal <- list(x = x.marginal, y = y.marginal) > zz <- loess((z2) ~ x * y) > grid <- expand.grid(xy.marginal) > grid[, "fit"] <- c(predict(zz, grid)) > > # step 2 > rangehere<-seq(floor(min(z2)/bynumb)*bynumb,ceiling(max(z2)/bynumb)*bynumb,by=bynumb) > # step 3 > colorrange<-round(seq(((rangehere[1]-deltaseq[1])/bynumb)+1,((max(rangehere)-deltaseq[1])/bynumb),1)) > > plot2 <- contourplot(fit~x*y, data = grid,cuts > length(colorrange)-2,region=TRUE, > ? ?col.regions=rev(rainbow(n=numbcolstotal))[colorrange], > > colorkey=list(col=rev(rainbow(n=numbcolstotal)),at=deltaseq,labels=list(at=deltaseq)), > ? ?xlab="distance to river (m)", ylab="lambda (/d)", main="Mean Z, S Clay > Loam, Trees") > > print(plot1, position=c(0, 0.5, 1, 1), more=TRUE) > print(plot2, position=c(0,0,1,0.5)) > > # --> second plot is OK, first one not... > -- > View this message in context: http://r.789695.n4.nabble.com/Same-color-key-for-multiple-lattice-contour-plots-tp3316654p3316654.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
joepvanderzanden
2011-Mar-22 13:55 UTC
[R] Same color key for multiple lattice contour plots
Hi Deepayan, Meanwhile I found another solution by simply creating more steps within the colorscale, so one could not notice when the colours mismatch one or two units. Your solution is more elegant though. Joep -- View this message in context: http://r.789695.n4.nabble.com/Same-color-key-for-multiple-lattice-contour-plots-tp3316654p3396456.html Sent from the R help mailing list archive at Nabble.com.