Search code examples
rggplot2pie-chart

Coloring scheme pie chart, ggplot2


I am making a pie chart with ggplot2, but I can't get the colors of the pie slices right.

df <- data.frame(group = c("Information technology", "Laboratory", "Tools", 
                           "Unspecified", "Other"), 
                 value = c(2500, 2000, 1500, 1000, 4000))

# Coloring scheme
blue1 <- "#0a3250"   # darkest blue
blue2 <- "#13517b"
blue3 <- "#2f659f"
blue4 <- "#518ecb"
blue5 <- "#aac8df"
blue6 <- "#d6e7f2"   # lightest blue
colorscheme <- scale_fill_manual(values = c(blue1, blue2, blue3,
                                            blue4, blue5, blue6))
# Data labels: 
df   <- df[!is.na(df$value),]   # Only keeps non-zero segments
lbls <- df$value/sum(df$value)
lbls <- percent(lbls)           # Converts to string and adds % sign
lbls[lbls == "0.0%"] <- ""      # Removes 0.0% as a label

# we now actually plot the data:
ggplot(df, aes(x = "", y = value, fill = group)) +   
    colorscheme +
    geom_bar(width = 1, stat = "identity", col = "white") + 
    xlab("") + ylab("") + 
    theme_bw() + 
    geom_text(aes(x     = 1.90, 
                  y     = value/2 + c(0, cumsum(value)[-length(value)]), 
                  label = lbls), size = 4) + 
    coord_polar(theta = "y") + 
    theme(
      axis.text       = element_blank(), 
      panel.grid      = element_blank(),
      panel.border    = element_blank(),
      legend.key      = element_rect(fill=NULL, colour = "white"),
      legend.key.size = unit(0.5, "cm"),
      legend.title    = element_blank(),
      legend.text     = element_text(size = 9)
)

What I want:

I want the first entry in df to have color blue1, second entry blue2, etc. In that way the slices go in clockwise order from darkest blue to lightest blue. Also, the legend should display the groups in the same order as in df.

What the problem is:

However, the colours are not assigned according to position in df, but rather according to alphabetical order. Now the different shades of blue are scattered over the pie slices and legend.


Solution

  • Use a factor for your categorical variable:

    df <- data.frame(group=factor(x=1:5, 
             labels=c("Information technology", "Laboratory", "Tools", "Unspecified", "Other")), 
                     value = c(2500, 2000, 1500, 1000, 4000))