Emular a paleta de cores padrão ggplot2

191

Que função posso usar para emular a paleta de cores padrão do ggplot2 para um número desejado de cores. Por exemplo, uma entrada 3 produziria um vetor de caracteres de cores HEX com estas cores: insira a descrição da imagem aqui

SFun28
fonte
10
Veja o pacote de balanças
hadley
2
Sim! Eu mantenho uma impressão display.brewer.all()na minha mesa. Eu acho que gosto do Set1 o melhor por fatores.
John Colby
boa ideia! Vou fazer a mesma impressão. Concordado em Set1, eu já me encontrei usando-o na maioria dos meus novos gráficos.
SFun28

Respostas:

264

São apenas tons igualmente espaçados ao redor da roda de cores, a partir de 15:

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

Por exemplo:

n = 4
cols = gg_color_hue(n)

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

insira a descrição da imagem aqui

John Colby
fonte
2
+1 Eu gosto da sua solução agradável e simples, embora ainda esteja tentando entender por que você tem length=n+1o seq, enquanto eu tenho.length=n
Andrie
18
Porque 0 == 360
hadley
129

Este é o resultado de

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

Ggplot de quatro cores

show_col(hue_pal()(3))

Ggplot de três cores

Climbs_lika_Spyder
fonte
1
Por incrível que pareça, as cores (pelo menos na segunda foto) não correspondem aos códigos RGB. No entanto, olhando para um gráfico que criei localmente, esses códigos RGB estão corretos.
Sparhawk
1
talvez seja uma coisa de navegador?
Climbs_lika_Spyder
1
Sim, muito estranho. No Firefox, o verde é # 15ba3e, no Chromium, é # 00b83a e, depois de baixar a imagem e visualizar em um programa de imagem dedicado (Gwenview), é # 00b839. Somente o Konqueror mostra corretamente como # 00ba38. Portanto, apenas um está certo e nenhum é consistente!
Sparhawk 29/01
1
? Existe alguma maneira de obter o nome da cor, por exemplo, 'red2', 'blue3" O código de cor, por exemplo # 00b83a, é difícil de usar de forma intuitiva.
Sibo Jiang
2
Para facilitar a cópia e colar, os valores hexadecimais são: # f8766d - Vermelho # 00ba38 - Verde # 83b0fc - Azul
pluke
62

Essas respostas são todas muito boas, mas eu queria compartilhar outra coisa que descobri no stackoverflow que é realmente bastante útil, aqui está o link direto

Basicamente, o @DidzisElferts mostra como você pode obter todas as cores, coordenadas etc. que o ggplot usa para criar um gráfico que você criou. Muito agradável!

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
Josh Morel
fonte
45

Na página 106 do livro ggplot2 de Hadley Wickham:

O esquema de cores padrão, scale_colour_hue, seleciona tons espaçados uniformemente ao redor da roda de cores hcl.

Com um pouco de engenharia reversa, você pode construir esta função:

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

Demonstrando isso no gráfico de barras:

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

insira a descrição da imagem aqui

Andrie
fonte
2
É ainda mais simples que isso. Você pode evitar a primeira linha de álgebra já que, embora não seja na ajuda, hclrecicla valores> 360
John Colby
13
Você ainda pode usar scales:::show_col(ggplotColours(n=3))para exibir a cor e os valores
Stat-R
embora eu ainda não descobri ainda como obter escalas e sua show_col para cuspir o (hex ou qualquer outro formato) os valores que traça ...
Stefano