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.

12voto

Roman Points 195

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

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

dispose d'un service permettant de 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

aborde le problème générique du point de vue des graphistes et donne de nombreux exemples de palettes utilisables.

Pour composer une palette à partir de valeurs RVB, il suffit de copier les valeurs dans un vecteur comme dans l'exemple suivant :

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

9voto

Minstein Points 393

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 !

6voto

Jot eN Points 422

Vous pouvez utiliser le Polychrome à cette fin. Il nécessite juste le nombre de couleurs et quelques seedcolors . Par exemple :

# install.packages("Polychrome")
library(Polychrome)

# create your own color palette based on `seedcolors`
P36 = createPalette(36,  c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)

Vous pouvez en savoir plus sur ce paquet à l'adresse suivante https://www.jstatsoft.org/article/view/v090c01 .

2voto

bJust Points 141

Selon moi, la recherche de couleurs distinctives est liée à une recherche efficace à partir d'un cube unitaire, où les trois dimensions du cube sont trois vecteurs le long des axes rouge, vert et bleu. Cela peut être simplifié par une recherche dans un cylindre (analogie HSV), où vous fixez la saturation (S) et la valeur (V) et trouvez des valeurs de teinte aléatoires. Cela fonctionne dans de nombreux cas, et vous pouvez le voir ici :

https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

En R,

get_distinct_hues <- function(ncolor,s=0.5,v=0.95,seed=40) {
  golden_ratio_conjugate <- 0.618033988749895
  set.seed(seed)
  h <- runif(1)
  H <- vector("numeric",ncolor)
  for(i in seq_len(ncolor)) {
    h <- (h + golden_ratio_conjugate) %% 1
    H[i] <- h
  }
  hsv(H,s=s,v=v)
}

Une autre méthode consiste à utiliser le paquet R "uniformly". https://cran.r-project.org/web/packages/uniformly/index.html

et cette simple fonction peut générer des couleurs distinctives :

get_random_distinct_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  rgb_mat <- runif_in_cube(n=ncolor,d=3,O=rep(0.5,3),r=0.5)
  rgb(r=rgb_mat[,1],g=rgb_mat[,2],b=rgb_mat[,3])
}

On peut penser à une fonction un peu plus impliquée par la recherche sur grille :

get_random_grid_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  ngrid <- ceiling(ncolor^(1/3))
  x <- seq(0,1,length=ngrid+1)[1:ngrid]
  dx <- (x[2] - x[1])/2
  x <- x + dx
  origins <- expand.grid(x,x,x)
  nbox <- nrow(origins) 
  RGB <- vector("numeric",nbox)
  for(i in seq_len(nbox)) {
    rgb <- runif_in_cube(n=1,d=3,O=as.numeric(origins[i,]),r=dx)
    RGB[i] <- rgb(rgb[1,1],rgb[1,2],rgb[1,3])
  }
  index <- sample(seq(1,nbox),ncolor)
  RGB[index]
} 

vérifier cette fonction par :

ncolor <- 20
barplot(rep(1,ncolor),col=get_distinct_hues(ncolor))          # approach 1
barplot(rep(1,ncolor),col=get_random_distinct_colors(ncolor)) # approach 2
barplot(rep(1,ncolor),col=get_random_grid_colors(ncolor))     # approach 3

Cependant, notez que définir une palette distincte avec des couleurs perceptibles par l'homme n'est pas simple. Laquelle des approches ci-dessus génère un ensemble de couleurs diversifié doit encore être testée.

1voto

Phoenix Mu Points 380

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 faire la différence entre elles.

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