ошибка ggplot2: недостаточные значения в ручном масштабе

когда у вас меньше цветов определен с scale_fill_manual чем уровни в фактор, ggplot2 жалуется с этим сообщением об ошибке :

# 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")

показывает:

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

Как избежать этой ошибки? Это особенно важно для меня, потому что я работаю на сервере с динамическими данными и R, встроенным в веб-сайт CMS, и не хочу, чтобы графики терпели неудачу, когда есть некоторые неправильные уровни (это может произойти, пока мы не исправили базу данных).

до сих пор я нашел обходной путь (см. Мой ответ), но мне интересно, есть ли более элегантное решение.

2 ответов


мой обходной путь до сих пор должен предоставить ggplot2 больше цветов, если появятся еще какие-либо уровни, например:

# 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"))

просто нашел способ заполнить палитру до нужного размера, выбрав из данного пула.

# 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)