Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I adjust the lower limit of scale_color_brewer?

I have ordered categorical data that I would like to use color brewer on. But I have a hard time seeing the very light lower values. Is there a way to either trim off those lower values or set the lower limit in the scale?

ggplot(data.frame(x=1:6, y=10:15, w=letters[1:6]), aes(x, y, color=w)) + 
geom_point()+ scale_color_brewer(type="seq", palette=1) + theme_bw()

Is there a better way to do this? So far I either see qualitative scales that aren't ordered or continuous scales that don't like being applied to discrete data. I'm aware of manual scales if that's the only route.

like image 305
Tom Avatar asked Nov 21 '14 06:11

Tom


3 Answers

You cannot just set a lower limit. But you can use a palette with more colors than needed and map the brightest colors to unused levels. Below is an example with 9 levels:

ggplot(data.frame(x=1:6, y=10:15, w=letters[1:6]), aes(x, y, color=w)) + 
  geom_point() + theme_bw() + 
  scale_color_brewer(type="seq", palette=1, 
                     limits=c(LETTERS[1:3], letters[1:6]), 
                     breaks=letters[1:6])
like image 90
shadow Avatar answered Oct 30 '22 02:10

shadow


While @shadow's answer was a start for me, the kind of brewer palette I needed to use (sequential) only has 9 values -- I had 8 categorical variables to plot! Removing only the 9th and lightest palette color still wasn't enough to make the color scheme completely visible.

So I used the colorRampPalette() function, which allows you to expand existing color palettes into continuous functions:

library(RColorBrewer)
ggplot(data.frame(x=1:6, y=10:15, w=letters[1:6]), aes(x, y, color=w)) + 
  geom_point() + theme_bw() + 
  scale_color_manual(values = colorRampPalette(brewer.pal(9, "YlGnBu"))(12)[6:12])

So in this case, I'm mapping the (maximum) 9 native colors from the "YlGnBu" palette onto 12 colors, and then only using the darkest 6 of those colors ([6:12]) in the plot.

like image 3
lauren.marietta Avatar answered Oct 30 '22 02:10

lauren.marietta


I'm not aware of any additional arguments you could pass to scale_colour_brewer() to set the lower limit of the scale (see http://docs.ggplot2.org/current/scale_brewer.html)

You have more flexibility with one of ggplot's colour options, which take the format of: scale_xxx_yyy, for example scale_fill_discrete() which take more arguments. See for example http://docs.ggplot2.org/current/scale_hue.html but also note the other options ('see also').

scale_fill_continuous might be a good starting place for ordinal data as you've requested.

You could, for example, pass colours from http://colorbrewer2.org/ to it, and choose a more suitable starting colour. The only problem is you would need to convert the rgb/hex values to HSL values using a tool such as: http://serennu.com/colour/hsltorgb.php

like image 1
Phil Avatar answered Oct 30 '22 02:10

Phil