Emula la tavolozza dei colori predefinita di ggplot2


193

Quale funzione posso usare per emulare la tavolozza dei colori predefinita di ggplot2 per un numero desiderato di colori. Ad esempio, un input di 3 produrrebbe un vettore di carattere di colori HEX con questi colori: inserisci qui la descrizione dell'immagine


10
Guarda il pacchetto di bilance
Hadley,

2
Sì! Tengo una stampa display.brewer.all()sulla mia scrivania. Penso che mi piace Set1 il migliore per i fattori.
John Colby,

buona idea! Farò la stessa stampa. D'accordo su Set1, mi sono già trovato ad usarlo nella maggior parte dei miei nuovi grafici.
SFun28,

Risposte:


267

Ha solo sfumature equidistanti attorno alla ruota dei colori, a partire da 15:

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}

Per esempio:

n = 4
cols = gg_color_hue(n)

dev.new(width = 4, height = 4)
plot(1:n, pch = 16, cex = 2, col = cols)

inserisci qui la descrizione dell'immagine


2
+1 Mi piace la tua bella, semplice soluzione, anche se sto ancora cercando di capire perché tu abbia length=n+1in seq, mentre io holength=n
Andrie

18
Perché 0 == 360
hadley,

131

Questo è il risultato di

library(scales)
show_col(hue_pal()(4))

Ggplot a quattro colori

show_col(hue_pal()(3))

Ggplot a tre colori


1
Stranamente, i colori (almeno nella seconda immagine) non corrispondono ai loro codici RGB. Tuttavia, guardando un grafico che ho creato localmente, questi codici RGB sono corretti.
Sparhawk,

1
forse è una cosa da browser?
Climbs_lika_Spyder,

1
Sì, molto strano. In Firefox, il green è # 15ba3e, in Chromium è # 00b83a, e dopo aver scaricato l'immagine e visualizzato in un programma di immagini dedicato (Gwenview) è # 00b839. Solo Konqueror lo mostra correttamente come # 00ba38. Quindi solo uno ha ragione, e nessuno è coerente!
Sparhawk,

1
Esiste un modo per ottenere il nome del colore, ad esempio 'red2', 'blue3 "? Il codice colore, ad esempio # 00b83a, è difficile da usare in modo intuitivo.
Sibo Jiang

2
Per facilità di copia e incolla i valori esadecimali sono: # f8766d - Rosso # 00ba38 - Verde # 83b0fc - Blu
pluke

63

Queste risposte sono tutte molto buone, ma volevo condividere un'altra cosa che ho scoperto su StackOverflow che è davvero molto utile, ecco il link diretto

Fondamentalmente, @DidzisElferts mostra come ottenere tutti i colori, le coordinate, ecc. Che ggplot usa per costruire un grafico che hai creato. Molto bella!

p <- ggplot(mpg,aes(x=class,fill=class)) + geom_bar()
ggplot_build(p)$data
[[1]]
     fill  y count x ndensity ncount  density PANEL group ymin ymax xmin xmax
1 #F8766D  5     5 1        1      1 1.111111     1     1    0    5 0.55 1.45
2 #C49A00 47    47 2        1      1 1.111111     1     2    0   47 1.55 2.45
3 #53B400 41    41 3        1      1 1.111111     1     3    0   41 2.55 3.45
4 #00C094 11    11 4        1      1 1.111111     1     4    0   11 3.55 4.45
5 #00B6EB 33    33 5        1      1 1.111111     1     5    0   33 4.55 5.45
6 #A58AFF 35    35 6        1      1 1.111111     1     6    0   35 5.55 6.45
7 #FB61D7 62    62 7        1      1 1.111111     1     7    0   62 6.55 7.45

45

Da pagina 106 del libro ggplot2 di Hadley Wickham:

La combinazione di colori predefinita, scale_colour_hue seleziona le tonalità equidistanti attorno alla ruota dei colori hcl.

Con un po 'di reverse engineering puoi costruire questa funzione:

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

Dimostrando questo nel barplot:

y <- 1:3
barplot(y, col = ggplotColours(n = 3))

inserisci qui la descrizione dell'immagine


2
È ancora più semplice di così. Puoi evitare la prima linea di algebra poiché, sebbene non sia di aiuto, hclricicla valori> 360.
John Colby,

13
È anche possibile utilizzare scales:::show_col(ggplotColours(n=3))per visualizzare il colore e i valori
Stat-R

anche se non ho ancora capito come ottenere scale e il suo show_col per sputare i valori (esadecimali o di qualsiasi altro formato) che traccia ...
Stefano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.