rggplot2colorsgeom-barstackedbarseries

Using multiple color scales in stacked bar plots with ggplot


I have a dataset where individual samples belong to a large group and a smaller subgroup. Each group has several subgroups, but each subgroup can only belong to one larger group. Likewise, each sample can only belong to one subgroup, and thus one larger group.

I want to make a True/False stacked bar plot with two color meanings:

This is close to what I want, but instead of light and dark grey, I would like light and dark red for the red fruits, light and dark green for the green fruits, and light and dark blue for the blue fruits.

fruit <- data.frame(Sample=1:20, 
                Fruit=c(rep("Apple", 3), rep("Strawberry", 2), rep("Grape", 4), 
                      rep("Watermelon", 4), rep("Lime", 3), rep("Blueberry", 2), 
                      rep("Plum", 2)), 
                Color=c(rep("Red", 9), rep("Green", 7), 
                        rep("Blue", 4)), 
                Ripe=c(rep(c(T, F), 10)))

fruit$Fruit <- factor(fruit$Fruit, unique(fruit$Fruit))
fruit$Color <- factor(fruit$Color, unique(fruit$Color))

ggplot(fruit, aes(Fruit)) +
    theme_bw() +
    geom_bar(stat="count", position="fill",
             aes(fill=Ripe, color=Color)) +
    scale_fill_manual(values=c("grey65", "grey85")) +
    scale_y_continuous(labels=scales::percent)

example

Is this possible? Or is there a better way I can visually distinguish the larger group membership with the true/false values? Thanks


Solution

  • Edit: this is probably the more correct way to do it, using interaction to assign unique colors for each factor pair:

    ggplot(fruit, aes(Fruit)) +
      geom_bar( aes(fill=interaction(Color,Ripe), color=Color), stat="count", position="fill")+ 
      scale_y_continuous(labels=scales::percent)+
      scale_fill_manual(values=c("pink","lightgreen","lightblue","red", "green","blue"))+
      theme_bw()
    

    enter image description here

    Map Color to fill, and Ripe to alpha:

    ggplot(fruit, aes(Fruit)) +
      geom_bar(stat="count", position="fill",
                 aes(fill=Color, color=Color,alpha=Ripe)) + 
      scale_y_continuous(labels=scales::percent)+
      scale_alpha_discrete(range=c(.5,1))+
      theme_bw()
    

    enter image description here