[R] ggplot 3-color gradient scales

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Tue Aug 25 13:01:46 CEST 2020


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:
> 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 using gmail.com <mailto:aprilettington using gmail.com>> wrote:
> 
>     Thank you so much!
> 
> 
>     On Mon, Aug 24, 2020 at 5:33 PM Rui Barradas <ruipbarradas using sapo.pt
>     <mailto:ruipbarradas using sapo.pt>> 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:
>          > Check out scale_colour_gradient2()
>          >
>          > On August 23, 2020 8:12:06 PM PDT, April Ettington
>         <aprilettington using gmail.com <mailto:aprilettington using gmail.com>> wrote:
>          >> 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
>          >>
>          >>      [[alternative HTML version deleted]]
>          >>
>          >> ______________________________________________
>          >> R-help using r-project.org <mailto:R-help using 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.
>          >
>



More information about the R-help mailing list