175 votes

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

Je trace un ensemble de données catégoriques et je souhaite utiliser des couleurs distinctes pour représenter les différentes catégories. Étant donné un nombre n comment puis-je obtenir n nombre de couleurs les plus distinctives dans R ? Merci.

150voto

Jelena-bioinf Points 1470

J'ai rejoint toutes les palettes qualitatives de RColorBrewer paquet. Les palettes qualitatives sont censées fournir chacune X couleurs les plus distinctives. Bien sûr, en les mélangeant, on obtient aussi des couleurs similaires, mais c'est le mieux 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 consiste à prendre toutes les couleurs R des dispositifs graphiques et à les échantillonner. J'ai supprimé 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

90voto

csgillespie Points 20349

Voici quelques options :

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

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

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

     library(RColorBrewer)
     brewer.pal(7, "BrBG")
  4. El Je veux la teinte Le site web donne beaucoup de belles palettes. Là encore, 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)))

56voto

Megatron Points 107

Vous pouvez également essayer le randomcoloR paquet :

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 circulaire (comme suggéré par d'autres réponses ici) :

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

enter image description here

Représenté dans un diagramme circulaire de 50 couleurs :

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

enter image description here

25voto

Gordon Schücker Points 417

Ce n'est pas une réponse à la question de l'OP, mais il est utile de mentionner qu'il y a les viridis qui possède de bonnes palettes de couleurs pour les données séquentielles. Elles sont uniformes du point de vue de la perception, sûres pour les daltoniens et faciles à imprimer.

Pour obtenir la palette, il suffit d'installer le paquet et d'utiliser la fonction viridis_pal() . Il y a quatre options "A", "B", "C" et "D" à choisir.

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

enter image description here

enter image description here

enter image description here

Il existe également un excellent exposé expliquant la complexité des bonnes cartes de couleurs sur YouTube :

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

14voto

Arun Points 41689

Vous pouvez utiliser colorRampPalette de la base ou RColorBrewer paquet :

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 hexagonaux :

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

Avec RColorBrewer vous pourriez utiliser des couleurs provenant de palettes préexistantes :

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

Regardez RColorBrewer pour les autres palettes disponibles. J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X