Emuluj domyślną paletę kolorów ggplot2

192

Jakiej funkcji mogę użyć do emulacji domyślnej palety kolorów ggplot2 dla żądanej liczby kolorów. Na przykład wprowadzenie wartości 3 spowoduje wygenerowanie wektora znaków kolorów HEX o następujących kolorach: wprowadź opis zdjęcia tutaj

SFun28
źródło
10
Spójrz na pakiet wag
hadley,
2
Tak! Na display.brewer.all()biurku mam wydruk . Myślę, że pod względem czynników podoba mi się Set1.
John Colby,
dobry pomysł! Zrobię ten sam wydruk. Uzgodniono na Set1, już używałem go na większości moich nowych map.
SFun28

Odpowiedzi:

267

To tylko równo rozmieszczone odcienie wokół koła kolorów, począwszy od 15:

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

Na przykład:

n = 4
cols = gg_color_hue(n)

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

wprowadź opis zdjęcia tutaj

John Colby
źródło
2
+1 Podoba mi się twoje miłe, proste rozwiązanie, chociaż wciąż próbuję zrozumieć, dlaczego tak jest length=n+1 w seq, natomiast mamlength=n
Andrie
18
Ponieważ 0 == 360
hadley
131

To wynik z

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

Czterokolorowy ggplot

show_col(hue_pal()(3))

Trójkolorowy ggplot

Climbs_lika_Spyder
źródło
1
Co dziwne, kolory (przynajmniej na drugim zdjęciu) nie pasują do kodów RGB. Jednak patrząc na wykres, który wykonałem lokalnie, te kody RGB poprawne.
Sparhawk
1
może jest to przeglądarka?
Climbs_lika_Spyder
1
Tak, bardzo dziwne. W Firefoksie kolor zielony to # 15ba3e, w Chromium to # 00b83a, a po pobraniu obrazu i wyświetleniu w dedykowanym programie graficznym (Gwenview) to # 00b839. Tylko Konqueror pokazuje to poprawnie jako # 00ba38. Więc tylko jeden ma rację i żaden nie jest spójny!
Sparhawk
1
Czy jest jakiś sposób, aby uzyskać nazwę koloru, np. „Czerwony2”, „niebieski3”? Kod koloru, np. # 00b83a, jest trudny w użyciu intuicyjnie.
Sibo Jiang
2
Dla ułatwienia kopiowania i wklejania wartości szesnastkowe to: # f8766d - czerwony # 00ba38 - zielony # 83b0fc - niebieski
pluke
62

Wszystkie te odpowiedzi są bardzo dobre, ale chciałem podzielić się inną rzeczą, którą odkryłem podczas stackoverflow, która jest naprawdę bardzo przydatna, oto bezpośredni link

Zasadniczo @DidzisElferts pokazuje, w jaki sposób można uzyskać wszystkie kolory, współrzędne itp., Których używa ggplot do zbudowania utworzonego przez siebie wykresu. Bardzo dobrze!

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
Josh Morel
źródło
45

Od strony 106 książki ggplot2 Hadleya Wickhama:

Domyślny schemat kolorów, scale_colour_hue, wybiera równomiernie rozmieszczone odcienie wokół koła kolorów hcl.

Przy odrobinie inżynierii wstecznej możesz zbudować tę funkcję:

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

Wykazanie tego na wykresie słupkowym:

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

wprowadź opis zdjęcia tutaj

Andrie
źródło
2
To jest jeszcze prostsze niż to. Możesz uniknąć pierwszej linii algebry, ponieważ chociaż nie ma jej w pomocy, hclprzetwarza wartości> 360.
John Colby,
13
Możesz nawet użyć scales:::show_col(ggplotColours(n=3))do wyświetlenia koloru i wartości
Stat-R
chociaż jeszcze nie wymyśliłem, jak uzyskać skale i jego show_col, aby wypluł wartości (szesnastkowe lub inny format), które kreśli ...
Stefano