Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

plot

r

[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))
like image 945
Munish Avatar asked Feb 10 '17 01:02

Munish


2 Answers

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)
like image 159
Tiffany Avatar answered Sep 24 '22 07:09

Tiffany


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)
     )
like image 28
Munish Avatar answered Sep 23 '22 07:09

Munish