Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot2 Error: Insufficient values in manual scale

Tags:

r

ggplot2

When you have less colours defined with scale_fill_manual than levels in a factor, ggplot2 complains with this error message :

# Basic definition of the plot
plot <- ggplot(s4r, aes(x=DIM, y=nbexpress, fill=DIM))

# Printing plot and options
plot + geom_bar(stat="identity", show_guide=FALSE) + 
  scale_fill_manual(values=c("#CC0000", "#006600", "#669999", "#00CCCC", 
                             "#660099", "#CC0066", "#FF9999", "#FF9900")

Shows:

Error: Insufficient values in manual scale. 10 needed but only 8 provided.

How to avoid this error? It is especially important to me because I work on a server with dynamic data and R embedded in a website CMS and don't want the graphs to fail when there are some wrong levels (this may happen, until we have corrected the database).

So far I've found a workaround (see my answer) but I'm wondering if there is any solution more elegant.

like image 306
Joel.O Avatar asked Sep 25 '13 07:09

Joel.O


2 Answers

My workaround so far is to provide ggplot2 with more colours, should any more levels appear, like this:

# Basic definition of the plot
plot <- ggplot(s4r, aes(x=DIM, y=nbexpress, fill=DIM))

# Printing plot and options + faceting if any
plot + geom_bar(stat="identity", show_guide=FALSE) + 
  scale_fill_manual(values=c("#CC0000", "#006600", "#669999", "#00CCCC", 
                             "#660099", "#CC0066", "#FF9999", "#FF9900", 
                             "black", "black", "black", "black", "black"))
like image 76
Joel.O Avatar answered Nov 07 '22 08:11

Joel.O


Just found a way to fill a palette to the needed size by picking from a given pool.

# count the needed levels of a factor
number <- nlevels(s4r$DIM)

# repeat the given colors enough times
palette <- rep(c("color1", "color2", ...), length.out = number)

# or, if you want a random distribution:
# if you want it random, but reproducable,
# backup .Random.seed, or set your own
set.seed(23)
palette <- sample(c("color1", "color2", ...), number, replace = TRUE)

scale_fill_manual(values=palette)
like image 20
eMPee584 Avatar answered Nov 07 '22 08:11

eMPee584