web-dev-qa-db-fra.com

changer les couleurs du facteur ggplot?

Je remarque qu'ici Boîte et moustaches tracent l'appel:

p + geom_boxplot(aes(fill = factor(cyl)))

génère des couleurs rouge/vert/bleu vif pour le remplissage des boîtes à moustaches, tandis que:

p + geom_boxplot(aes(fill = factor(vs)))

Génère un vert/rouge pâle distinct de couleurs. Dans mes données, j'obtiens le deuxième ensemble de couleurs, mais je voudrais le premier ensemble (comme dans

p + geom_boxplot(aes(fill = factor(cyl)))

qu'est-ce qui contrôle quel ensemble de couleurs ggplot utilise et comment pouvez-vous le changer?

Merci

30
user248237

Les couleurs par défaut sont des teintes régulièrement espacées autour de la roue chromatique. Vous pouvez vérifier comment cela est généré à partir de ici .

Vous pouvez utiliser scale_fill_manual Avec ces couleurs:

p + scale_fill_manual(values=c("#F8766D", "#00BA38"))

Ici, j'ai utilisé ggplot_build(p)$data de cyl pour obtenir les couleurs.

Alternativement, vous pouvez également utiliser une autre palette:

p + scale_fill_brewer(palette="Set1")

Et pour trouver les couleurs dans la palette, vous pouvez faire:

require(RColorBrewer)
brewer.pal(9, "Set1")

Vérifiez l'emballage pour connaître les palettes et autres options, si vous êtes intéressé.

Edit: @ user248237dfsf, comme je l'ai déjà souligné dans le lien en haut, cette fonction de @Andrie montre les couleurs générées:

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

> ggplotColours(2)
# [1] "#F8766D" "#00BFC4"

> ggplotColours(3)
# [1] "#F8766D" "#00BA38" "#619CFF"

Si vous regardez les deux couleurs générées, la première est la même, mais la deuxième couleur n'est pas la même, lorsque n = 2 et n = 3. C'est parce qu'il génère des couleurs de teintes régulièrement espacées. Si vous souhaitez utiliser les couleurs pour cyl pour vs, vous devrez définir scale_fill_manual Et utiliser ces couleurs générées avec n = 3 à partir de cette fonction.

Pour vérifier que c'est bien ce qui se passe, vous pouvez faire:

p1 <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
           geom_boxplot(aes(fill = factor(cyl)))

p2 <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
           geom_boxplot(aes(fill = factor(vs)))

Maintenant, si vous le faites:

ggplot_build(p1)$data[[1]]$fill
# [1] "#F8766D" "#00BA38" "#619CFF"

ggplot_build(p2)$data[[1]]$fill
# [1] "#F8766D" "#00BFC4" "#F8766D" "#00BFC4" "#F8766D"

Vous voyez que ce sont les couleurs qui sont générées à l'aide de ggplotColours et la raison de la différence est également évidente. J'espère que ça aide.

40
Arun

Ajout aux réponses précédentes:

Lorsque vous utilisez l'esthétique col (au lieu de fill), utilisez scale_color_manual. Ceci est utile pour geom_point():

myColors <- c("#56ddc5", "#ff3db7", "#4699dd")
ggplot(mtcars, aes(x=mpg, y=hp, col=as.factor(cyl))) + 
  geom_point() +
  scale_color_manual(values=myColors)

enter image description here

8
Megatron