Great, it works perfectly! Thanks so much for the awesome help!
(Happy) patrick

On Jan 9, 2014, at 7:07, Adams, Jean <jvad...@usgs.gov> wrote:

> Patrick,
> 
> No error in your code, just two different ways of deriving a range of colors 
> ... heat.colors() and color.scale().  I modified the code to just use 
> color.scale().  You can tell it what two colors you want it to use for the 
> extremes, and it will work out the shades in between.
> 
> Jean
> 
> 
> 
> # fake data
> fake  <- cbind(c(1,2,5,8,12,19), c(2,5,8,12,19,20), c(1,1,1,1,1,1), runif(6, 
> 0, 2), runif(6, 0, 2))
> 
> mymatrix <- fake
> dimnames(mymatrix)[[2]] <- letters[1:dim(fake)[2]]
> 
> # separate the first two columns from the remaining columns for simplicity
> mymatrix12 <- mymatrix[, 1:2]
> mymatrix3plus <- mymatrix[, -(1:2)]
> # create variables for the dimensions for easy reference later
> nrows <- dim(mymatrix3plus)[1]
> ncols <- dim(mymatrix3plus)[2]
> 
> # to make sure that the min and max contain all of the data
> # use floor(100*...)/100 and ceiling(100*...)/100 instead of round(..., 2) 
> datalim <- c(floor(100*min(mymatrix3plus)), 
> ceiling(100*max(mymatrix3plus)))/100
> # choose two colors to be the end points
> colorlim <- c("yellow", "red")
> # create a sequence of 10 colors across the selected range for the legend
> lut <- color.scale(seq(datalim[1], datalim[2], length=10), extremes=colorlim, 
> xrange=datalim)
> # it's not clear from the help file, but the extremes= argument wants a range 
> (a vector of length 2)
> mycolors <- array(color.scale(mymatrix3plus, extremes=colorlim, 
> xrange=datalim), dim=dim(mymatrix3plus))
> ycenter <- seq(from=0, to=1, length=(nrows + 2))
> yheight <- 1/(nrows + 2)
> 
> # Plot the color key on the lower part
> ColorBar(lut=lut, min=datalim[1], max=datalim[2])
> 
> # Plot the actual heatmap
> par(new=TRUE)
> # can't use title for main= argument, because title only exists inside the 
> ColorBar() function
> plot(c(mymatrix12[1, 1], mymatrix12[nrows, 2]), c(0, 1), col="White", 
> xlab="", ylab="", main="SOMETHING", axes=F)
> for(i in 1:ncols){
>       RectPlotter(mymatrix12, ycenter[nrows - i + 2], yheight, mycolors[, i])
>       text(mymatrix12[1,1], ycenter[nrows - i + 2], 
> colnames(mymatrix3plus)[i], pos=4)
> }
> 
> 
> 
> On Wed, Jan 8, 2014 at 3:59 PM, Pachapep <pacha...@gmail.com> wrote:
> 
> Hi Jean,
> Thanks for the great help. Indeed, it seems that that helps a bit. However, I 
> included a ‘control’ column made of ones.
> 
>> fake  <- cbind(c(1,2,5,8,12,19), c(2,5,8,12,19,20), c(1,1,1,1,1,1), runif(6, 
>> 0, 2), runif(6, 0, 2), runif(6, 0, 2))
> 
> However, the color doesn’t correspond to that in the key (it is red-ish in 
> the plot while the 1 corresponds to yellow-ish in the key), so I’m not sure 
> whether it is the key or the colors that are messed up. Sorry for all these 
> questions.. and thanks (again) for the help provided.
> 
> 
> 
> 
> 
> 
> 
> On Jan 8, 2014, at 16:15, Adams, Jean <jvad...@usgs.gov> wrote:
> 
>> Patrick,
>> 
>> Thanks for providing reproducible code!
>> 
>> I think the main problem was that the extremes= argument in the 
>> color.scale() function wants a range (a vector of length 2), and you were 
>> providing with more than that, length(lut) is 10.
>> 
>> In the process of tracking this down, I made a bunch of minor changes to 
>> your code to help me see what was going on.  This is what I ended up with.
>> 
>> Jean
>> 
>> 
>> 
>> # fake data
>> fake  <- cbind(c(1,2,5,8,12,19), c(2,5,8,12,19,20), c(1,1,1,1,1,1), runif(6, 
>> 0, 2), runif(6, 0, 2), runif(6, 0, 2))
>> mymatrix <- fake
>> dimnames(mymatrix)[[2]] <- letters[1:5]
>> 
>> # separate the first two columns from the remaining columns for simplicity
>> mymatrix12 <- mymatrix[, 1:2]
>> mymatrix3plus <- mymatrix[, -(1:2)]
>> # create variables for the dimensions for easy reference later
>> nrows <- dim(mymatrix3plus)[1]
>> ncols <- dim(mymatrix3plus)[2]
>> 
>> # prepare plotting parameters
>> lut <- rev(heat.colors(10))
>> # to make sure that the min and max contain all of the data
>> # use floor(100*...)/100 and ceiling(100*...)/100 instead of round(..., 2) 
>> minimum <- floor(100*min(mymatrix3plus))/100
>> maximum <- ceiling(100*max(mymatrix3plus))/100
>> # it's not clear from the help file, but the extremes= argument wants a 
>> range (a vector of length 2)
>> mycolors <- color.scale(mymatrix3plus, extremes=lut[c(1, length(lut))])
>> ycenter <- seq(from=0, to=1, length=(nrows + 2))
>> yheight <- 1/(nrows + 2)
>> 
>> # Plot the color key on the lower part
>> ColorBar(lut=lut, min=minimum, max=maximum)
>> 
>> # Plot the actual heatmap
>> par(new=TRUE)
>> # can't use title for main= argument, because title only exists inside the 
>> ColorBar() function
>> plot(c(mymatrix12[1, 1], mymatrix12[nrows, 2]), c(0, 1), col="White", 
>> xlab="", ylab="", main="SOMETHING", axes=F)
>> for(i in 1:ncols){
>>      RectPlotter(mymatrix12, ycenter[nrows - i + 2], yheight, mycolors[, i])
>>      text(mymatrix12[1,1], ycenter[nrows - i + 2], 
>> colnames(mymatrix3plus)[i], pos=4)
>> }
>> 
>> 
>> 
>> On Wed, Jan 8, 2014 at 2:13 PM, Pachapep <pacha...@gmail.com> wrote:
>> 
>> Hi Jean,
>> Thanks a ton for the help. I think I’m almost there, but there is still 
>> something weird about my stuff.
>> I have been able to understand the color.scale() function. Now, I am trying 
>> to plot a key for the corresponding colors. The function is called ColorBar, 
>> which apparently works - the colors are indeed lut <- rev(heat.colors(10)) 
>> and go from my minimum to my maximum values. However, when I try to apply 
>> this to my mycolors( and then plot it, I suddenly have colors that seem to 
>> be outside of the min-max (in the greens and blacks), instead of the white 
>> to red gradient. Hope this is not too complicated of a code, but I think 
>> copy-paste it should give the (problematic) result. I guess there is a small 
>> error somewhere, but I can’t figure out what I have done wrong :-(
>> Thanks a lot for any suggestion.
>> Patrick
>> 
>> 
>> #------------------------------------------------------------
>> library(plotrix)
>> #------------------------------------------------------------
>> # ColorBar
>> ColorBar <- function(lut, min, max, nticks=5, ticks=seq(min, max, 
>> len=nticks), title='') {
>>   scale = (length(lut)-1)/(max-min)
>>   plot(c(min,max),c(0,10), type='n', bty='n', xaxt='n', xlab='', yaxt='n', 
>> ylab='', main=title)
>>   axis(1, ticks, las=1, cex.axis=0.5, lwd=0.5)
>>   for (i in 1:(length(lut)-1)) {
>>     y = (i-1)/scale + min
>>     rect(y,0,y+1/scale,0.5, col=lut[i], border=NA)
>>   }  
>> }
>> 
>> #------------------------------------------------------------
>> # RectPlotter
>> RectPlotter <- function(matrixval, ycoord, height, mycolors){
>>   rect(matrixval[,1], (ycoord-(0.4*height)), matrixval[,2], 
>> (ycoord+(0.4*height)), col=mycolors, border = NA)
>> }
>> 
>> fake  <- cbind(c(1,2,5,8,12,19), c(2,5,8,12,19,20), runif(6, 0, 2), runif(6, 
>> 0, 2), runif(6, 0, 2))
>>   mymatrix <- fake
>>   # Plot the color key on the lower part
>>   lut <- rev(heat.colors(10))
>>   minimum <- round(min(mymatrix[,-(1:2)]), digits=2)
>>   maximum <- round(max(mymatrix[,-(1:2)]), digits=2)
>>   ColorBar(lut=lut, min=minimum, max=maximum)
>>   par(new=TRUE)
>>   #____________________________________________
>>   #_______________PROBLEM HERE_______________
>>   mycolors <- cbind(mymatrix[,1:2],color.scale(mymatrix[,-(1:2)], 
>> extremes=lut))
>>   plot(c(mymatrix[1,1],mymatrix[length(mymatrix[,1]),2]), c(0,1), 
>> col="White", xlab="", ylab="", main=title, axes=F)
>>   ycenter <- seq(from=0, to=1, length=(length(mymatrix[1,])+2))
>>   yheight <- 1/length(ycenter)
>>   
>>   # Plot the actual heatmap
>>   for(i in 3:length(mymatrix[1,])){
>>     #for(i in 3:5){
>>     RectPlotter(mymatrix[,c(1,2,i)], ycenter[length(ycenter)-i+2], yheight, 
>> mycolors[,i])
>>     text(mymatrix[1,1], ycenter[length(ycenter)-i+2], colnames(mymatrix)[i], 
>> cex=0.5, pos=4)
>>   }
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> On Jan 7, 2014, at 18:48, Adams, Jean <jvad...@usgs.gov> wrote:
>> 
>>> Patrick,
>>> 
>>> You should cc r-help on all correspondence so that others can follow the 
>>> thread.
>>> 
>>> The color range will be matched to the "x" argument you provide to the 
>>> color.scale function (in package plotrix).  So you don't need to manually 
>>> provide the min and max yourself.  If for some reason you did need to 
>>> provide that information, you would use the xrange argument not the 
>>> extremes argument (which is expecting colors).
>>> 
>>> mycolors <- color.scale(mymatrix[,-(1:2)], c(0,1,1), c(1,1,0), c(1,0,1))
>>> 
>>> Jean
>>> 
>>> 
>>> On Tue, Jan 7, 2014 at 4:16 PM, Pachapep <pacha...@gmail.com> wrote:
>>> 
>>> Hi Jean
>>> Thanks for the quick answer. It looks like it works, but the issue is that 
>>> my real data fluctuates between 0 and 2, so I everything is red.
>>> I tried using another function (color.scale), which works but gives me grey 
>>> scale only (no colors) although I don’t really understand why - it’s a 
>>> detail, but it's kind of a bummer..
>>> 
>>> mycolors <- color.scale(mymatrix[,-(1:2)], c(0,1,1), c(1,1,0), c(1,0,1), 
>>> extremes=c(min(mymatrix[,-(1:2)]), max(mymatrix[,-(1:2)])))  
>>> 
>>> Is there a way to make an array using the min and max of the matrix (as I 
>>> used in color.scale() above) so that the colors go from blue to red?
>>> Thanks again for the help.
>>> Patrick
>>> 
>>> On Jan 7, 2014, at 15:04, Adams, Jean <jvad...@usgs.gov> wrote:
>>> 
>>>> Patrick,
>>>> 
>>>> You were pretty close.
>>>> To fix the code you have, just change "matrix" to "mymatrix" in two 
>>>> places, and either specify the argument data= or place the heat.colors bit 
>>>> first in the matrix function.
>>>> 
>>>> Or ... you could use the array() function instead, to shorten up the code 
>>>> a little.
>>>>      mycol <- array(heat.colors(max(mymatrix[, 3:5]))[mymatrix[, 3:5]], 
>>>> dim=dim(mymatrix))
>>>> 
>>>> Jean
>>>> 
>>>> 
>>>> On Mon, Jan 6, 2014 at 9:19 PM, Pachapep <pacha...@gmail.com> wrote:
>>>> Hi all,
>>>> I have a matrix which I want to plot in color. I have extensively looked 
>>>> at level plot and heatmap/heatmap.2, but I would like to be able to manage 
>>>> the size of the bins (boxes)  on my X axis. So I thought of simply using 
>>>> the rect() function, but I can’t get around assigning the correct colors 
>>>> to all the values. I have built a RectPlotter() function that takes the 
>>>> start and stop as well as the value assigned to each ‘bin’.
>>>> Here is what I have done so far (after countless hours of despair):
>>>> 
>>>> RectPlotter <- function(matrixval, ycoord, height, mycolors){
>>>>  rect(matrixval[,1], (ycoord-(0.4*height)), matrixval[,2], 
>>>> (ycoord+(0.4*height)), col=mycolors, border = NA)
>>>> }
>>>> 
>>>> starts <- c(1,5,8,15)
>>>> ends <- c(5, 8, 15, 25)
>>>> vals1 <- c(2, 15, 7, 13)
>>>> vals2 <- c(7, 2, 1, 26)
>>>> vals3 <- c(52, 1, 29, 18)
>>>> mymatrix <- cbind(starts, ends, vals1, vals2, vals3)
>>>> # This gives me an error
>>>> mycol<- matrix(nrow=dim(mymatrix)[1], ncol=dim(mymatrix)[2], 
>>>> heat.colors(max(matrix[,3:5]))[matrix[,3:5]])
>>>> 
>>>> 
>>>> At the end, I would like to have something like a levelplot, but using the 
>>>> starts and ends as x-axis.
>>>> Any help would be highly appreciated. Thanks!
>>>> Patrick
>>>> ______________________________________________
>>>> R-help@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.
>>>> 
>>> 
>>> 
>> 
>> 
> 
> 
> 


        [[alternative HTML version deleted]]

______________________________________________
R-help@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.

Reply via email to