Daniel Bernstein
2008-Aug-06 23:57 UTC
[R] Attempting to make a custom color spectrum to use in heatmap.2
Hello there! I'd just like to say in advance, "Thank you," for any help and/or advice. My problem is as follows: I have a dataset that is made up of percentages. I've assigned my "error" percentages a value of '-100', my "non-existent" percentages a value of '0', and all my other percentages are normal values that range from the high 60's to 100. I would like to create a heatmap that designates my "error" values as gray, my "non-existent" values as black, and I would like to to have the rest of my values, say 50 to 100, as a rainbow-type spectrum (like the palette "Spectral" in RColorBrewer, except with 50 values). I've tried using breaks, and then implementing the breaks in my heatmap.2 command. The breaks work just fine. I guess what I want to control is the range of the: col=(colorpanel(#, low="color1", mid="color2", high="color3")) command. Is there any way to set more values than "low," "mid," and "high?" If that is possible I think it would solve my problem. I've looked over the documentation and searched over previous color/heatmap-related questions, but haven't come across anything that points me in the right direction. Please let me know if any of what I said needs clarifying before you can give me what you feel is an appropriate response. Thanks again for your time. Regards, Daniel
Thomas Lumley
2008-Aug-07 03:37 UTC
[R] Attempting to make a custom color spectrum to use in heatmap.2
colorRampPalette() may do what you want.
-thomas
On Wed, 6 Aug 2008, Daniel Bernstein wrote:
> Hello there! I'd just like to say in advance, "Thank you,"
for any help and/or
> advice.
>
> My problem is as follows:
>
> I have a dataset that is made up of percentages. I've assigned my
"error"
> percentages a value of '-100', my "non-existent"
percentages a value of '0',
> and all my other percentages are normal values that range from the high
60's to
> 100. I would like to create a heatmap that designates my "error"
values as
> gray, my "non-existent" values as black, and I would like to to
have the rest
> of my values, say 50 to 100, as a rainbow-type spectrum (like the palette
> "Spectral" in RColorBrewer, except with 50 values).
>
> I've tried using breaks, and then implementing the breaks in my
heatmap.2
> command. The breaks work just fine. I guess what I want to control is the
range
> of the:
>
> col=(colorpanel(#, low="color1", mid="color2",
high="color3"))
>
> command. Is there any way to set more values than "low,"
"mid," and "high?" If
> that is possible I think it would solve my problem. I've looked over
the
> documentation and searched over previous color/heatmap-related questions,
but
> haven't come across anything that points me in the right direction.
>
> Please let me know if any of what I said needs clarifying before you can
give
> me what you feel is an appropriate response. Thanks again for your time.
>
> Regards,
>
> Daniel
>
> ______________________________________________
> 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.
>
Thomas Lumley Assoc. Professor, Biostatistics
tlumley at u.washington.edu University of Washington, Seattle
Jim Lemon
2008-Aug-07 09:18 UTC
[R] Attempting to make a custom color spectrum to use in heatmap.2
On Wed, 2008-08-06 at 16:57 -0700, Daniel Bernstein wrote:> Hello there! I'd just like to say in advance, "Thank you," for any help > and/or advice. > > My problem is as follows: > > I have a dataset that is made up of percentages. I've assigned my > "error" percentages a value of '-100', my "non-existent" percentages a > value of '0', and all my other percentages are normal values that range > from the high 60's to 100. I would like to create a heatmap that > designates my "error" values as gray, my "non-existent" values as black, > and I would like to to have the rest of my values, say 50 to 100, as a > rainbow-type spectrum (like the palette "Spectral" in RColorBrewer, > except with 50 values). > > I've tried using breaks, and then implementing the breaks in my > heatmap.2 command. The breaks work just fine. I guess what I want to > control is the range of the: > > col=(colorpanel(#, low="color1", mid="color2", high="color3")) > > command. Is there any way to set more values than "low," "mid," and > "high?" If that is possible I think it would solve my problem. I've > looked over the documentation and searched over previous > color/heatmap-related questions, but haven't come across anything that > points me in the right direction. >Hi Daniel, You can map values to colors using "color.scale" in the plotrix package. What you want would require that you separate out the 50+ values to get the graduated colors, then set the -100 and 0 values to black and gray. Say your dataset is a matrix named "mydata", a sneaky way might be: missval<-which(mydata == -100) nonext<-which(mydata == 0) # this gives you the lowest value that you want in the color range mydata[c(missval,nonext)]<-50 # this gives you a matrix of colors that start at 50=red and # range to 100=blue mycellcolors<-color.scale(mydata,c(1,1,0,0),c(0,1,1,0),c(0,0,0.5,1)) # the next two lines set the colors for missing and non-existent values mycellcolors[missval]<-"black" mycellcolors[nonext]<-"gray" # display the matrix as colors, using the calculated colors color2D.matplot(mydata,cellcolors=mycellcolors) I can't work out how to do this with "image" or "heatmap", but someone else might be able to tell you. Jim