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, <n.hub...@ncmls.ru.nl> 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: n.hub...@ncmls.ru.nl > 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]] > > ______________________________________________ > R-help@r-project.org 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. ______________________________________________ R-help@r-project.org 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.