Tuesday, July 25, 2017

image.plot in R not displaying colorscale values at the edges of color scale

Leave a Comment

[Here top images is output from R 3.2.5, same code produces bottom image in R 2.15.2, notice the diff in color scale labels on the right side. I want to resolve the 'shift' of labels in the top plot. Sample code given in this query was used to generate both plots.

Notice the diff in color scale label on two images. top image is the output from R 3.2.5, same code produces bottom image in R 2.15.2. I want to resolve the 'shift' of labels in the top plot to match the bottom one. Sample code given in this query was used to generate both plots.

I am trying to plot a map using image.plot but the min and max value of colorscale are not displayed exactly at the tips. I am facing this issue in R version 3.2.5 (2016-04-14); Platform: x86_64-w64-mingw32/x64 (64-bit) and library package 'fields' Spam version 1.4-0 (2016-08-29)

In contrast, the same commands could be correctly displayed the min and max values at the edges of color scale in R version 2.15.2 (2012-10-26), Platform: x86_64-w64-mingw32/x64 (64-bit) and 'fields' package 0.41-0 (2014-02-26). Here is sample code:

library(fields) temp <- matrix(data=rexp(200, rate=10), nrow=180, ncol=360) min(temp) max(temp) color_plate <- c("#FF0000", "#FF4D00", "#FF7000", "#FF8A00", "#FFA800", "#FFBF00", "#FFF000", "#FFFF54", "#AAFFFF","#7FFFFF", "#55FFFF", "#2AFFFF", "#00CFFF", "#20BFFF", "#209FFF", "#2060FF")  zlim <- seq(0.08,0.40,by=0.04) temp[temp<min(zlim)] <- min(zlim) temp[temp>max(zlim)] <- max(zlim)  image.plot(temp,col=color_plate,             axis.args=list(cex.axis =1,at=zlim, labels=zlim,mgp=c(1, 0, 0),tck=0.1)) 

2 Answers

Answers 1

The best I could do to answer this question was to escape the confines of image.plot()and recode the heat map in ggplot2. The code I wrote should relocate your tick marks to the appropriate locations. Note that "Var1" and "Var2" in the ggplot object p can be switched depending on how you want the data displayed. I used melt() to transform the temp object which means that the original row/column designation is lost. I wasn't sure which plotted on the x/y axis in the image.plot() function, so if I chose the wrong one be sure to switch "Var1" and "Var2".

I hope this helps!

library(fields) library(reshape2) library(ggplot2) library(grid)  temp <- matrix(data=rexp(200, rate=10), nrow=180, ncol=360)  color_palette <- c("#FF0000", "#FF4D00", "#FF7000", "#FF8A00",         "#FFA800", "#FFBF00", "#FFF000", "#FFFF54", "#AAFFFF","#7FFFFF",         "#55FFFF", "#2AFFFF", "#00CFFF", "#20BFFF", "#209FFF", "#2060FF")  zlim <- seq(0.08,0.40,by=0.04) zlim2 <- seq(0.08,0.40,by=0.02)  temp[temp<min(zlim)] <- min(zlim) temp[temp>max(zlim)] <- max(zlim) rownames(temp) <- seq(0,1,1/(length(temp[,1])-1)) colnames(temp) <- seq(0,1,1/(length(temp[1,])-1))  tdm <- melt(temp)  tdm$val_for_color <- NA ##can change this as long as you end up with 17 classes (labeled 1-17) for color assignment for(i in 1:(length(zlim2)-1)){     tdm$val_for_color[which(tdm$value >= zlim2[[i]] & tdm$value <= zlim2[[i+1]] )] <- i }  p <- ggplot(tdm, aes(x = Var1, y = Var2, fill = val_for_color)) +         geom_raster() + scale_fill_gradientn(breaks=seq(1,length(zlim),1),colors=color_palette, labels=zlim)+          scale_x_continuous(expand=c(0,0)) +         scale_y_continuous(expand=c(0,0)) +         guides(fill = guide_colorbar(draw.ulim = TRUE,draw.llim = FALSE,                         barwidth = 0.7, barheight = 10, limits=c(min(zlim),max(zlim)), raster=FALSE,                         ticks=FALSE,                         title=NULL))+         ylab(NULL)+         xlab(NULL)+         theme_bw()  g <- ggplotGrob(p)  #this shifts and spreads the labels d <-g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]] g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]] <- g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[1]]-d for(i in 2:length(g$grobs[[15]][[1]][[1]]$grobs[[3]]$y)){     g$grobs[[15]][[1]][[1]]$grobs[[3]]$y[[i]] <- d*5*(i-1) }  grid.draw(g) 

Answers 2

I got the answer from package creator of fields package. Pasting the sample code here for others..

library(fields)  temp <- matrix( seq( 0,.5,,80), 8,10)  colTab <- c("#FF0000", "#FF4D00","#FF7000", "#FF8A00", "#FF7000")  N<- length( colTab)  breaks <- seq(0.08, 0.40,  length.out= N+1 )  image.plot(temp, col=colTab, breaks=breaks,            axis.args=list(cex.axis =1, at=breaks, labels= breaks, mgp=c(1, 0, 0), tck=0.1)      ) 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment