Рандомизация качественных цветов для больших наборов в ggplot

Если вы качественно сопоставляете цвет для большого количества групп, ggplot автоматически присваивает цветовое соответствие очень близким цветам, что затрудняет просмотр, которые относятся к какому ключу и т.д. Чтобы проиллюстрировать:

require(ggplot2); require(stringr)
df = data.frame(x = letters, y = sample(20:100,26), lab=word("apple ball cat dog elephant frog goat hat ice jackal king lion mango nest owl parrot queen rabbit ship tomato umbrella van watch xylophone yatch zebra", 1:26))
p = ggplot(df, aes(x, y, fill=lab)) + geom_bar(stat="identity")
p + scale_fill_discrete()

enter image description here

Его можно смешивать с некоторыми случайными цветами вручную:

cols = rainbow(26, s=.6, v=.9)[sample(1:26,26)]
p + scale_fill_manual(values=cols)

enter image description here

.., что приводит к более полезному расщеплению радуги, но это кажется неуклюжим, все же оставляет некоторые цвета, сложенные вместе и, как правило, не идеальные. У ggplot есть собственный метод для достижения чего-то подобного (но, надеюсь, лучше)?

Ответ 1

Создание хорошей палитры для множества цветов - действительно сложная задача. Однако есть одно решение, которое может быть полезным. Некоторое время назад я искал этот репо и нашел ссылку на iWantHue. Насколько я вижу, результирующая палитра уже смешана, так что соседние цвета выглядят различимыми.

Например, для вашего примера у меня есть enter image description here

На всякий случай, палитра

"#89C5DA", "#DA5724", "#74D944", "#CE50CA", "#3F4921", "#C0717C", "#CBD588", "#5F7FC7", 
"#673770", "#D3D93E", "#38333E", "#508578", "#D7C1B1", "#689030", "#AD6F3B", "#CD9BCD", 
"#D14285", "#6DDE88", "#652926", "#7FDCC0", "#C84248", "#8569D5", "#5E738F", "#D1A33D", 
"#8A7C64", "#599861"