Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

and I want to plot BP against LOG10, and color the points by R2. R2 are continuous values from 0-1.

myplot <- read.cvs("mytable.csv",head=TRUE)
attach(myplot)
ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point() 

So far, so good. However I would like to display the R2 colors in manually selected intervals and colors, like this (if I had discrete values).

ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point() + 
      scale_color_manual(breaks= c("1","0.8","0.6","0.4","0.2","0"), 
                values = c("red","yellow","green","lightblue","darkblue"))
Error: Continuous value supplied to discrete scale

This looks pretty, but I would rather set the colors my self.

ggplot(myplot,aes(BP,LOG10, color=R2)) + geom_point(shape=1) + 
               scale_colour_gradientn(colours = rainbow(10))

So, how can I manually select intervals from continuous values (1-0.8, 0.8-0.6, 0.6-0.4, 0.4-0.2, 0.2-0), and color them to my liking (red, yellow, green, light, darkblue)? A smooth gradient between the colors would be cool, but not crucial.

You can use scale_colour_gradientn() and then provide your own colours= and values=. Values will give intervals for each color.

ggplot(myplot,aes(BP,LOG10, color = R2)) + geom_point() + 
  scale_colour_gradientn(colours = c("red","yellow","green","lightblue","darkblue"),
                         values = c(1.0,0.8,0.6,0.4,0.2,0)) 
                Thanks a lot Didzis, that totally solves it!  Do you also have a solution without gradients, so rather all values from 1-0.8 = red, 0.8-0.6 = yellow, and so on?
– user2724998
                Aug 29, 2013 at 6:39
                Then you should divide your data in intervals using cut() function and use those intervals as discrete values.
– Didzis Elferts
                Aug 29, 2013 at 6:50
                How do I make this gradient across the 6 different values but only from blue to red? I would like to only provide "low" and "high" color and the intermediate levels are blended over accordingly. I'm talking of a discrete version of this:  scale_color_gradient(low="blue", high="red").  I could only get it to work with a custom function but there must be an easier way: color.gradient.discrete = function(color.low, color.high, n) {   scales::seq_gradient_pal(low=color.low, high=color.high)(seq(0, 1, length.out = n)) }
– Mario Reutter
                Sep 15, 2021 at 10:10
                Absolutely! Caught me as well. See camille's point in stackoverflow.com/q/51901813/4606130
– micstr
                Oct 23, 2018 at 8:13
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.