Emule la paleta de colores predeterminada ggplot2

193

¿Qué función puedo usar para emular la paleta de colores predeterminada de ggplot2 para un número deseado de colores? Por ejemplo, una entrada de 3 produciría un vector de caracteres de colores HEX con estos colores: ingrese la descripción de la imagen aquí

SFun28
fuente
10
Mira el paquete de balanzas
hadley
2
¡Sí! Tengo una copia impresa display.brewer.all()en mi escritorio. Creo que me gusta Set1 lo mejor para los factores.
John Colby
¡buena idea! Voy a hacer la misma copia impresa. De acuerdo con el Set1, ya me he encontrado usándolo en la mayoría de mis nuevos gráficos.
SFun28

Respuestas:

267

Tiene tonos igualmente espaciados alrededor de la rueda de colores, 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 ejemplo:

n = 4
cols = gg_color_hue(n)

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

ingrese la descripción de la imagen aquí

John Colby
fuente
2
+1 Me gusta tu solución agradable y simple, aunque todavía estoy tratando de entender por qué tienes length=n+1en el seq, mientras que yo tengolength=n
Andrie
18
Porque 0 == 360
hadley
131

Este es el resultado de

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

Ggplot de cuatro colores

show_col(hue_pal()(3))

Ggplot tricolor

Climbs_lika_Spyder
fuente
1
Por extraño que parezca, los colores (al menos en la segunda imagen) no coinciden con sus códigos RGB. Sin embargo, mirando un gráfico que hice localmente, estos códigos RGB son correctos.
Sparhawk
1
tal vez es una cosa del navegador?
Climbs_lika_Spyder
1
Si, muy raro. En Firefox, el verde es # 15ba3e, en Chromium es # 00b83a, y después de descargar la imagen y verla en un programa de imagen dedicado (Gwenview) es # 00b839. Solo Konqueror lo muestra correctamente como # 00ba38. ¡Entonces solo uno tiene razón, y ninguno es consistente!
Sparhawk
1
¿Hay alguna forma de obtener el nombre del color, por ejemplo, 'rojo2', 'azul3 "? El código de color, por ejemplo, # 00b83a, es difícil de usar intuitivamente.
Sibo Jiang
2
Para facilitar la copia y el pegado, los valores hexadecimales son: # f8766d - Rojo # 00ba38 - Verde # 83b0fc - Azul
Pluke
63

Todas estas respuestas son muy buenas, pero quería compartir otra cosa que descubrí en stackoverflow que es realmente bastante útil, aquí está el enlace directo

Básicamente, @DidzisElferts muestra cómo puedes obtener todos los colores, coordenadas, etc. que ggplot usa para construir un diagrama que creaste. ¡Muy agradable!

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
fuente
45

De la página 106 del libro ggplot2 de Hadley Wickham:

El esquema de color predeterminado, scale_colour_hue selecciona tonos uniformemente espaciados alrededor de la rueda de color hcl.

Con un poco de ingeniería inversa, puede construir esta función:

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

Demostrando esto en el diagrama de barras:

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

ingrese la descripción de la imagen aquí

Andrie
fuente
2
Es incluso más simple que esto. Puede evitar la primera línea de álgebra ya que, aunque no está en la ayuda, hclrecicla valores> 360.
John Colby
13
Incluso puede usar scales:::show_col(ggplotColours(n=3))para mostrar el color y los valores
Stat-R
aunque todavía no he descubierto cómo obtener escalas y su show_col para escupir los valores (hexadecimales o cualquier otro formato) que traza ...
Stefano