Émuler la palette de couleurs par défaut de ggplot2

205

Quelle fonction puis-je utiliser pour émuler la palette de couleurs par défaut de ggplot2 pour un nombre de couleurs souhaité. Par exemple, une entrée de 3 produirait un vecteur de caractères de couleurs HEX avec ces couleurs: entrez la description de l'image ici

SFun28
la source
10
Regardez le paquet de balances
hadley
2
Oui! Je garde une impression display.brewer.all()sur mon bureau. Je pense que j'aime mieux Set1 pour les facteurs.
John Colby
bonne idée! Je vais faire la même impression. D'accord sur Set1, je me suis déjà retrouvé à l'utiliser dans la plupart de mes nouveaux graphiques.
SFun28

Réponses:

275

Il s'agit simplement de teintes également espacées autour de la roue chromatique, à partir de 15:

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

Par exemple:

n = 4
cols = gg_color_hue(n)

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

entrez la description de l'image ici

John Colby
la source
2
+1 J'aime votre solution simple et agréable, même si j'essaie toujours de comprendre pourquoi vous avez length=n+1dans le seq, alors que j'ailength=n
Andrie
18
Parce que 0 == 360
hadley
144

C'est le résultat de

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

Ggplot à quatre couleurs

show_col(hue_pal()(3))

Ggplot trois couleurs

Climbs_lika_Spyder
la source
1
Curieusement, les couleurs (au moins dans la deuxième image) ne correspondent pas à leurs codes RVB. Cependant, en regardant un graphique que j'ai fait localement, ces codes RVB sont corrects.
Sparhawk
1
peut-être que c'est une chose de navigateur?
Climbs_lika_Spyder
1
Oui, très étrange. Dans Firefox, le vert est # 15ba3e, dans Chromium c'est # 00b83a, et après avoir téléchargé l'image et visionné dans un programme d'image dédié (Gwenview), c'est # 00b839. Seul Konqueror l'affiche correctement sous la forme # 00ba38. Donc, un seul a raison, et aucun n'est cohérent!
Sparhawk
1
? Est - il possible d'obtenir le nom de la couleur, par exemple « rouge2 », « Blue3" Le code de couleur, par exemple # 00b83a, est difficile à utiliser de manière intuitive.
Sibo Jiang
2
Pour faciliter le copier-coller, les valeurs hexadécimales sont: # f8766d - Rouge # 00ba38 - Vert # 83b0fc - Bleu
pluke
66

Ces réponses sont toutes très bonnes, mais je voulais partager une autre chose que j'ai découverte sur stackoverflow qui est vraiment très utile, voici le lien direct

Fondamentalement, @DidzisElferts montre comment vous pouvez obtenir toutes les couleurs, coordonnées, etc. que ggplot utilise pour construire un tracé que vous avez créé. Très agréable!

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
la source
46

De la page 106 du livre ggplot2 de Hadley Wickham:

La palette de couleurs par défaut, scale_colour_hue, sélectionne des teintes régulièrement espacées autour de la roue chromatique hcl.

Avec un peu de rétro-ingénierie, vous pouvez construire cette fonction:

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

Démontrer cela dans barplot:

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

entrez la description de l'image ici

Andrie
la source
2
C'est encore plus simple que ça. Vous pouvez éviter la première ligne d'algèbre puisque, bien qu'elle ne soit pas dans l'aide, hclrecycle les valeurs> 360.
John Colby
13
Vous pouvez même utiliser scales:::show_col(ggplotColours(n=3))pour afficher la couleur et les valeurs
Stat-R
bien que je n'ai pas encore compris comment obtenir des échelles et son show_col pour cracher les valeurs (hexadécimales ou tout autre format) qu'il trace ...
Stefano