web-dev-qa-db-fra.com

Comment générer un certain nombre de couleurs les plus distinctives dans R?

Je trace un jeu de données catégorique et souhaite utiliser des couleurs distinctives pour représenter différentes catégories. Étant donné un nombre n, comment puis-je obtenir n nombre de couleurs PLUS GRANDES en R? Merci.

109
RNA

J'ai rejoint toutes les palettes qualitatives du package RColorBrewer. Les palettes qualitatives sont supposées fournir chacune X couleurs les plus distinctives. Bien sûr, les mélanger dans une palette contient également des couleurs similaires, mais c'est le meilleur que je puisse obtenir (74 couleurs).

library(RColorBrewer)
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
pie(rep(1,n), col=sample(col_vector, n))

 colour_Brewer_qual_60

Une autre solution est la suivante: prendre toutes les couleurs R des périphériques graphiques et en échantillonner. J'ai enlevé les nuances de gris car elles sont trop similaires. Cela donne 433 couleurs

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]

 set of 20 colours

pie(rep(1,n), col=sample(color, n))

avec 200 couleurs n = 200:

pie(rep(1,n), col=sample(color, n))

 set of 200 colours

83
Jelena-bioinf

Voici quelques options:

  1. Jetez un coup d’œil à la fonction palette

    palette(Rainbow(6))     # six color Rainbow
    (palette(gray(seq(0,.9,len = 25)))) #grey scale
    
  2. Et la fonction colorRampPalette:

    ##Move from blue to red in four colours
    colorRampPalette(c("blue", "red"))( 4) 
    
  3. Regardez le paquetage colorBrewer (et site web ). Si vous voulez des couleurs divergentes, sélectionnez diverging sur le site. Par exemple, 

    library(colorBrewer)
    brewer.pal(7, "BrBG")
    
  4. Le site Web Je veux de la teinte donne beaucoup de belles palettes. Encore une fois, il suffit de sélectionner la palette dont vous avez besoin. Par exemple, vous pouvez obtenir les couleurs RGB du site et créer votre propre palette:

    palette(c(rgb(170,93,152, maxColorValue=255),
        rgb(103,143,57, maxColorValue=255),
        rgb(196,95,46, maxColorValue=255),
        rgb(79,134,165, maxColorValue=255),
        rgb(205,71,103, maxColorValue=255),
        rgb(203,77,202, maxColorValue=255),
        rgb(115,113,206, maxColorValue=255)))
    
57
csgillespie

Vous pouvez également essayer le paquet randomcoloR :

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)

Vous pouvez voir qu'un ensemble de couleurs très distinctes est choisi lors de la visualisation dans un graphique à secteurs (comme suggéré par d'autres réponses ici):

pie(rep(1, n), col=palette)

 enter image description here

Représenté dans un graphique à secteurs avec 50 couleurs:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)

 enter image description here

25
Megatron

Il existe également un moyen plutôt "nouveau" d’obtenir une palette de couleurs distincte optimale, également en ce qui concerne le daltonisme et la conversion possible en noir et blanc avec les palettes de couleurs Viridis .

Pour obtenir la palette, installez simplement le paquet et utilisez la fonction viridis_pal()

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked

Avec les options "A", "B", "C" et "D", vous pouvez choisir entre ces palettes:

 enter image description here

Pour plus d'exemples, visitez la vignette du paquet. Quelques exemples magnifiques:

 enter image description here

 enter image description here

Il existe également un excellent exposé sur la complexité des bonnes palettes sur YouTube:

Une meilleure palette de couleurs par défaut pour Matplotlib | SciPy 2015 | Nathaniel Smith et Stéfan van der Walt

14
Gordon Schücker

Vous pouvez utiliser le paquetage colorRampPalette de la base ou RColorBrewer:

Avec colorRampPalette, vous pouvez spécifier les couleurs comme suit:

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

Vous pouvez également fournir des codes hexadécimaux:

colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...

Avec RColorBrewer, vous pouvez utiliser des couleurs de palettes préexistantes:

require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"

Regardez le paquet RColorBrewer pour les autres palettes disponibles. J'espère que cela t'aides.

13
Arun

Je recommanderais d'utiliser une source externe pour les grandes palettes de couleurs.

http://tools.medialab.sciences-po.fr/iwanthue/

a un service pour composer n'importe quelle taille de palette en fonction de divers paramètres et 

https://graphicdesign.stackexchange.com/questions/3682/where-can-i-find-a- large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

discute du problème générique du point de vue des concepteurs graphiques et donne de nombreux exemples de palettes utilisables.

Pour composer une palette de valeurs RVB, il vous suffit de copier les valeurs dans un vecteur, par exemple:

colors37 = c("#466791","#60bf37","#953ada","#4fbe6c","#ce49d3","#a7b43d","#5a51dc","#d49f36","#552095","#507f2d","#db37aa","#84b67c","#a06fda","#df462a","#5b83db","#c76c2d","#4f49a3","#82702d","#dd6bbb","#334c22","#d83979","#55baad","#dc4555","#62aad3","#8c3025","#417d61","#862977","#bba672","#403367","#da8a6d","#a79cd4","#71482c","#c689d0","#6b2940","#d593a7","#895c8b","#bd5975")
8
Roman

J'ai trouvé un site Web proposant une liste de 20 couleurs distinctives: https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors/

col_vector<-c('#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080', '#ffffff', '#000000')

Vous pouvez essayer!

1
Minstein

Vous pouvez générer un ensemble de couleurs comme ceci:

myCol = c("pink1", "Violet", "mediumpurple1", "slateblue1", "purple", "purple3",
          "turquoise2", "skyblue", "steelblue", "blue2", "navyblue",
          "orange", "tomato", "coral2", "palevioletred", "violetred", "red2",
          "springgreen2", "yellowgreen", "palegreen4",
          "wheat2", "tan", "tan2", "tan3", "brown",
          "grey70", "grey50", "grey30")

Ces couleurs sont aussi distinctes que possible. Pour les couleurs similaires, elles forment un dégradé afin que vous puissiez facilement distinguer les différences.

0
Phoenix Mu