color heatmap according to value ranges

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

color heatmap according to value ranges

N.Hubner
Probably the simplest thing there is, but I can't get it to work:



Example for my data:



a <- c(1,1,1,2,2,2,3,3,3)

b <- c(1,2,3,1,2,3,1,2,3)

c <- c(1,2,3,4,5,6,7,8,9)

df <- data.frame(cbind(a,b,c))



I create a heat map with c being the values:



ggplot(df, aes(df$a, df$b, fill = df$c)) + geom_raster()



problem:

The color coding is automatically a gradient. However, I would like to color in 4 fixed colors dependent on the value in c. For example:



if c<=2 color "darkblue"

if 2<c<=3 color "blue"

if 3<c<=5 color "lightblue"

if c>5 color "white"



In addition I would like to show a legend that illustrates this color coding.



It must be very easy, but I just can't figure it out. Only find commands that make gradients...



Thanks a lot in advance!




______________________________________________

Dr. Nina C. Hubner
scientist quantitative proteomics

Department of Molecular Biology, Radboud University Nijmegen, The Netherlands
e-mail: [hidden email]
tel: +31-24-3613655

Visiting address:
Department of Molecular Biology, RIMLS, 2nd floor
Geert Grooteplein 26/28
6525 GA Nijmegen
The Netherlands



The Radboud University Medical Centre is listed in the Commercial Register of the Chamber of Commerce under file number 41055629.

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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 | Threaded
Open this post in threaded view
|

Re: color heatmap according to value ranges

djmuseR
Hi:

You get a gradient for your response variable because it is numeric.
You need to convert it to factor. (Discrete color sets need to be
mapped to discrete variables - a factor is one way to generate a
discrete variable.)  Here is one approach to get what you appear to be
looking for.

DF <- data.frame(a = rep(1:3, each = 3),
                 b = 1:3, d = 1:9)
DF$e <- cut(DF$d, c(0, 2, 3, 5, 10), rightmost = TRUE,
             labels = c("1-2", "2-3", "3-5", ">5"))

library(ggplot2)
ggplot(DF, aes(x = a, y = b, fill = e)) +
   geom_tile() +
   scale_fill_manual(values = c("darkblue", "blue", "lightblue", "white"))

You need a border of some kind around the plot since the right side of
the graph is the same color as the default background. If you're OK
with the default graph above, that's fine. If you want to expand it to
the edges, you need to draw your own border, something like

ggplot(DF, aes(x = a, y = b, fill = e)) +
   geom_tile() +
   scale_fill_manual(values = c("darkblue", "blue", "lightblue", "white")) +
  # eliminate the padding from each scale
   scale_x_continuous(expand = c(0, 0)) +
   scale_y_continuous(expand = c(0, 0)) +
 # draw the border
   theme(panel.border = element_rect(colour = "black", fill = NA))

The problem that remains is an inability to distinguish the legend key
color in the last category from the plot background. The simplest
workaround is to change the color of the last category in the scale
specification - one suggestion is a light gray, but you can always
substitute another color:

ggplot(DF, aes(x = a, y = b, fill = e)) +
   geom_tile() +
   scale_fill_manual(values = c("darkblue", "blue", "lightblue", "grey90")) +
   scale_x_continuous(expand = c(0, 0)) +
   scale_y_continuous(expand = c(0, 0)) +
   theme(panel.border = element_rect(colour = "black", fill = NA))

Dennis

On Fri, Feb 6, 2015 at 7:13 AM,  <[hidden email]> wrote:

> Probably the simplest thing there is, but I can't get it to work:
>
>
>
> Example for my data:
>
>
>
> a <- c(1,1,1,2,2,2,3,3,3)
>
> b <- c(1,2,3,1,2,3,1,2,3)
>
> c <- c(1,2,3,4,5,6,7,8,9)
>
> df <- data.frame(cbind(a,b,c))
>
>
>
> I create a heat map with c being the values:
>
>
>
> ggplot(df, aes(df$a, df$b, fill = df$c)) + geom_raster()
>
>
>
> problem:
>
> The color coding is automatically a gradient. However, I would like to color in 4 fixed colors dependent on the value in c. For example:
>
>
>
> if c<=2 color "darkblue"
>
> if 2<c<=3 color "blue"
>
> if 3<c<=5 color "lightblue"
>
> if c>5 color "white"
>
>
>
> In addition I would like to show a legend that illustrates this color coding.
>
>
>
> It must be very easy, but I just can't figure it out. Only find commands that make gradients...
>
>
>
> Thanks a lot in advance!
>
>
>
>
> ______________________________________________
>
> Dr. Nina C. Hubner
> scientist quantitative proteomics
>
> Department of Molecular Biology, Radboud University Nijmegen, The Netherlands
> e-mail: [hidden email]
> tel: +31-24-3613655
>
> Visiting address:
> Department of Molecular Biology, RIMLS, 2nd floor
> Geert Grooteplein 26/28
> 6525 GA Nijmegen
> The Netherlands
>
>
>
> The Radboud University Medical Centre is listed in the Commercial Register of the Chamber of Commerce under file number 41055629.
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> 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.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
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.