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


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


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


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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.