3

This question comes from another question: Different coloring of groups in R plot

I'd like to elarn to change the hue of one geom without affecting another. So here the boxplot grouping and point grouping map to the same variable. Changing the hue for one changes the other. How could I change the hue for the box fill but not the point fill; in other words make the point fill lighter in color so they stand out against the same color of the box fill?

#Data

library(RColorBrewer) 
library(reshape2)

a=rnorm(100, mean=1)
b=rnorm(100, mean=0, sd=1)
ab=data.frame(a,b)
melt=melt(ab)
bpColor=brewer.pal(4, 'RdBu')

#Current

ggplot(melt, aes(fill=variable, x=variable, y=value)) +
    geom_boxplot(notch = TRUE) + 
    geom_jitter(position = position_jitter(width = .05, height =0), shape=21, size=1.5) +
    scale_fill_hue(l=40) 

enter image description here

Community
  • 1
  • 1
Tyler Rinker
  • 108,132
  • 65
  • 322
  • 519
  • 1
    I _think_ this is related to the one-scale-per aesthetics. See e.g. [**here**](https://groups.google.com/forum/#!topic/ggplot2/lDvsd4yJ0AE) and [**here**](http://stackoverflow.com/questions/16129876/ggplot2-multiple-scales-legends-per-aesthetic-revisited). I believe you will need `ggplot_build` hacks, where you replace colours in your `ggplot` data object, like [**this example on scale_fill_continuous**](http://stackoverflow.com/questions/20474465/using-different-scales-as-fill-based-on-factor/20479882#20479882). There are quite a few similar exampes around on SO. – Henrik Apr 07 '14 at 20:22
  • 1
    I saw you were thinking of changing `alpha` of the points in the previous question. What about changing `alpha` of the boxes instead; `geom_boxplot(notch = TRUE, alpha = 0.4)`? Quick and dirty. Just a thought... – Henrik Apr 07 '14 at 20:36

1 Answers1

1

It may be simpler to create a boxplot and then a pointplot with a lighter hue, and overlay the points over the boxes. Borrowing the ideas from this post, let me illustrate:

library(ggplot2)
library(RColorBrewer) 
library(reshape2)
library(gridExtra)
library(gtable)

# make up data
a=rnorm(100, mean=1)
b=rnorm(100, mean=0, sd=1)
ab=data.frame(a,b)
melt=melt(ab)
bpColor=brewer.pal(4, 'RdBu')

## create a boxplot
g1 <- ggplot(melt, aes(fill=variable, x=variable, y=value)) +
  geom_boxplot(notch = TRUE) + 
  scale_fill_hue(l=40) +
  theme_bw()

## create a pointplot with a lighter hue
g2 <- ggplot(melt, aes(fill=variable, x=variable, y=value)) +
  geom_jitter(position = position_jitter(width = .05, height =0), shape=21, size=3) +
  scale_fill_hue(l=100) +
  theme(panel.background = element_rect(fill = NA))

gt_boxes <- ggplot_gtable(ggplot_build(g1))
gt_points <- ggplot_gtable(ggplot_build(g2))

## overlay the points over the boxes
just_boxes <- c(subset(gt_boxes$layout, name == "panel", se = t:r))
g_together <- gtable_add_grob(gt_boxes, gt_points$grobs[[which(gt_points$layout$name == "panel")]], 
                              just_boxes$t, just_boxes$l, just_boxes$b, just_boxes$l)
grid.draw(g_together)

enter image description here

Masato Nakazawa
  • 970
  • 6
  • 11