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.
Réponses
Trop de publicités?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
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")
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 !
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 .
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.
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.
- Réponses précédentes
- Plus de réponses