Skip to content

ggplot 3-color gradient scales

7 messages · April Ettington, Jeff Newmiller, Rui Barradas +1 more

#
Currently I am using these settings in ggplot to make a gradient from red
to blue.

geom_point( aes(x, y, color=z) ) +
scale_colour_gradient(low = "red",high = "blue") +

z is a ratio, and currently I am able to identify which have high and low
values, but I'd really like to be able to distinguish which are >1, <1, or
close to 1 by color.  It would be great if I could set a middle color in
this gradient (eg. green) that is set the the value of 1, even if that is
not the exact midpoint between my highest and lowest values.  Is there a
way to do this in R?

Thank you,
April
#
Check out scale_colour_gradient2()
On August 23, 2020 8:12:06 PM PDT, April Ettington <aprilettington at gmail.com> wrote:

  
    
#
Hello,

Note that the midpoint argument can make a big difference. In the code 
below try commenting out the line where the default is changed.


f <- function(x){
   (x - min(x))/(max(x) - min(x))
}

library(ggplot2)

df1 <- iris[3:5]
names(df1)[1:2] <- c("x", "y")
df1$z <- ave(df1$y, df1$Species, FUN = f)

ggplot(df1) +
   geom_point( aes(x, y, color = z) ) +
   scale_color_gradient2(low = "red",
                         mid = "yellow",
                         high = "blue",
                         midpoint = 0.5
                         )

Hope this helps,

Rui Barradas


?s 04:43 de 24/08/20, Jeff Newmiller escreveu:
#
Thank you so much!
On Mon, Aug 24, 2020 at 5:33 PM Rui Barradas <ruipbarradas at sapo.pt> wrote:

            

  
  
1 day later
#
Is there a way to set it to 3 color categories instead of a gradient?  Like
if the color is based on the numbers in a dataframe column, can I make it
so anything >1.2 is red, <0.8 is blue, and anything in the middle is green?


On Mon, Aug 24, 2020 at 6:28 PM April Ettington <aprilettington at gmail.com>
wrote:

  
  
#
Hi

Maybe scale_colour_manual?

Cheers
Petr
#
Hello,

If you want a predetermined number of colors, discretise the data and 
use scale_color_manual. In the code below I first compute another vector 
z, with a different range, 0 to 2. (In my first mail it was 0 to 1.)

g <- function(x, a = 0, b = 1){
   (b - a)*(x - min(x))/(max(x) - min(x)) + a
}

library(ggplot2)

df1 <- iris[3:5]
names(df1)[1:2] <- c("x", "y")
df1$z <- ave(df1$y, df1$Species, FUN = function(x) g(x, a = 0, b = 2))


Now is the step that solves the problem, to bin the vector. Other 
options could include findInterval. Then the two plot instructions are 
equivalent.

df1$z <- cut(df1$z,
              breaks = c(-Inf, 0.8, 1.2, Inf),
              labels = c("Small", "Medium", "Large"))


ggplot(df1) +
   geom_point( aes(x, y, color = z) ) +
   scale_color_manual(values = c("red", "green", "blue"))

ggplot(df1) +
   geom_point( aes(x, y, color = z) ) +
   scale_color_manual(breaks = c("Small", "Medium", "Large"),
                      values = c("Small" = "red", "Medium" = "green", 
"Large" = "blue"))


Hope this helps,

Rui Barradas


?s 10:38 de 25/08/20, April Ettington escreveu: