Эмулировать цветовую палитру ggplot2 по умолчанию

193

Какую функцию я могу использовать, чтобы эмулировать цветовую палитру ggplot2 по умолчанию для желаемого количества цветов. Например, при вводе 3 будет создан символьный вектор цветов HEX с этими цветами: введите описание изображения здесь

SFun28
источник
10
Посмотрите на пакет весов
Хэдли
2
Да! Я держу распечатку display.brewer.all()на моем столе. Я думаю, что мне нравится Set1 лучше всего для факторов.
Джон Колби
отличная идея! Я собираюсь сделать ту же распечатку. Согласившись на Set1, я уже использовал его в большинстве своих новых графиков.
SFun28

Ответы:

267

Это просто одинаково расставленные тона вокруг цветового круга, начиная с 15:

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}

Например:

n = 4
cols = gg_color_hue(n)

dev.new(width = 4, height = 4)
plot(1:n, pch = 16, cex = 2, col = cols)

введите описание изображения здесь

Джон Колби
источник
2
+1 Я как Ницца, простое решение, хотя я до сих пор пытаюсь понять , почему у вас есть length=n+1в seq, в то время как у меня естьlength=n
Andrie
18
Потому что 0 == 360
Хэдли
131

Это результат от

library(scales)
show_col(hue_pal()(4))

Четыре цвета ggplot

show_col(hue_pal()(3))

Три цвета ggplot

Climbs_lika_Spyder
источник
1
Как ни странно, цвета (по крайней мере, на втором рисунке) не соответствуют их кодам RGB. Однако, глядя на график , который я сделал на месте, эти RGB коды являются правильными.
Sparhawk
1
может быть, это вещь браузера?
Climbs_lika_Spyder
1
Да, очень странно. В Firefox зеленый цвет - # 15ba3e, в Chromium - # 00b83a, а после загрузки изображения и просмотра в специальной графической программе (Gwenview) - # 00b839. Только Konqueror правильно показывает это как # 00ba38. Так что только один прав, и ни один не является последовательным!
Sparhawk
1
Есть ли способ получить название цвета, например, 'red2', 'blue3 "? Код цвета, например # 00b83a, трудно использовать интуитивно.
Сибо Цзян,
2
Для простоты копирования и вставки шестнадцатеричные значения: # f8766d - красный # 00ba38 - зеленый # 83b0fc - синий
pluke
63

Все эти ответы очень хороши, но я хотел бы поделиться еще одной вещью, которую я обнаружил в stackoverflow, которая действительно весьма полезна, вот прямая ссылка

По сути, @DidzisElferts показывает, как вы можете получить все цвета, координаты и т. Д., Которые ggplot использует для построения созданного вами графика. Очень хорошо!

p <- ggplot(mpg,aes(x=class,fill=class)) + geom_bar()
ggplot_build(p)$data
[[1]]
     fill  y count x ndensity ncount  density PANEL group ymin ymax xmin xmax
1 #F8766D  5     5 1        1      1 1.111111     1     1    0    5 0.55 1.45
2 #C49A00 47    47 2        1      1 1.111111     1     2    0   47 1.55 2.45
3 #53B400 41    41 3        1      1 1.111111     1     3    0   41 2.55 3.45
4 #00C094 11    11 4        1      1 1.111111     1     4    0   11 3.55 4.45
5 #00B6EB 33    33 5        1      1 1.111111     1     5    0   33 4.55 5.45
6 #A58AFF 35    35 6        1      1 1.111111     1     6    0   35 5.55 6.45
7 #FB61D7 62    62 7        1      1 1.111111     1     7    0   62 6.55 7.45
Джош Морел
источник
45

Со страницы 106 книги ggplot2 Хэдли Уикхем:

Цветовая схема по умолчанию scale_colour_hue выбирает равномерно распределенные оттенки вокруг цветового круга hcl.

Немного реверс-инжиниринга вы можете построить эту функцию:

ggplotColours <- function(n = 6, h = c(0, 360) + 15){
  if ((diff(h) %% 360) < 1) h[2] <- h[2] - 360/n
  hcl(h = (seq(h[1], h[2], length = n)), c = 100, l = 65)
}

Демонстрируя это в барплоте:

y <- 1:3
barplot(y, col = ggplotColours(n = 3))

введите описание изображения здесь

Andrie
источник
2
Это даже проще, чем это. Вы можете избежать первой строки алгебры, поскольку, хотя она не в справке, hclповторяет значения> 360.
Джон Колби,
13
Вы даже можете использовать scales:::show_col(ggplotColours(n=3))для отображения цвета и значений
Stat-R
хотя я еще не выяснил, как получить весы и его show_col, чтобы выкладывать (шестнадцатеричный или любой другой формат) значения, которые он чертит ...
Stefano