Emulieren Sie die Standardfarbpalette von ggplot2

191

Mit welcher Funktion kann ich die Standardfarbpalette von ggplot2 für eine gewünschte Anzahl von Farben emulieren? Zum Beispiel würde eine Eingabe von 3 einen Zeichenvektor von HEX-Farben mit diesen Farben erzeugen: Geben Sie hier die Bildbeschreibung ein

SFun28
quelle
10
Schauen Sie sich das
Waagenpaket an
2
Ja! Ich habe einen Ausdruck display.brewer.all()an meinem Schreibtisch. Ich denke, ich mag Set1 am besten für Faktoren.
John Colby
gute Idee! Ich werde den gleichen Ausdruck machen. Ich bin mit Set1 einverstanden und habe es bereits in den meisten meiner neuen Charts verwendet.
SFun28

Antworten:

264

Ab 15 sind die Farbtöne um das Farbrad gleichmäßig verteilt:

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

Beispielsweise:

n = 4
cols = gg_color_hue(n)

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

Geben Sie hier die Bildbeschreibung ein

John Colby
quelle
2
+1 Ich mag Ihre nette, einfache Lösung, obwohl ich immer noch versuche zu verstehen, warum Sie length=n+1in der haben seq, während ich habelength=n
Andrie
18
Weil 0 == 360
Hadley
129

Dies ist das Ergebnis von

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

Vierfarbiges ggplot

show_col(hue_pal()(3))

Dreifarbiges ggplot

Climbs_lika_Spyder
quelle
1
Seltsamerweise stimmen die Farben (zumindest im zweiten Bild) nicht mit ihren RGB-Codes überein. In einem Diagramm, das ich lokal erstellt habe, sind diese RGB-Codes jedoch korrekt.
Sparhawk
1
Vielleicht ist es eine Browsersache?
Climbs_lika_Spyder
1
Ja, sehr seltsam. In Firefox ist das Grün # 15ba3e, in Chromium # 00b83a und nach dem Herunterladen des Bildes und dem Anzeigen in einem speziellen Bildprogramm (Gwenview) # 00b839. Nur Konqueror zeigt es korrekt als # 00ba38 an. Also ist nur einer richtig und keiner ist konsistent!
Sparhawk
1
Gibt es eine Möglichkeit, den Farbnamen zu erhalten, z. B. 'red2', 'blue3 "? Der Farbcode, z. B. # 00b83a, ist schwer intuitiv zu verwenden.
Sibo Jiang
2
Zum leichteren Kopieren und Einfügen sind die Hex-Werte: # f8766d - Rot # 00ba38 - Grün # 83b0fc - Blau
Pluke
62

Diese Antworten sind alle sehr gut, aber ich wollte eine andere Sache teilen, die ich beim Stackoverflow entdeckt habe und die wirklich sehr nützlich ist. Hier ist der direkte Link

Grundsätzlich zeigt @DidzisElferts, wie Sie alle Farben, Koordinaten usw. erhalten können, die ggplot zum Erstellen eines von Ihnen erstellten Diagramms verwendet. Sehr schön!

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
quelle
45

Ab Seite 106 des ggplot2-Buches von Hadley Wickham:

Das Standardfarbschema scale_colour_hue wählt gleichmäßig verteilte Farbtöne um das hcl-Farbrad aus.

Mit ein wenig Reverse Engineering können Sie diese Funktion konstruieren:

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

Dies in Barplot demonstrieren:

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

Geben Sie hier die Bildbeschreibung ein

Andrie
quelle
2
Es ist noch einfacher als das. Sie können die erste Zeile der Algebra vermeiden, da sie hclWerte> 360 recycelt , obwohl sie nicht in der Hilfe enthalten ist.
John Colby
13
Sie können sogar verwenden scales:::show_col(ggplotColours(n=3)), um die Farbe und Werte anzuzeigen
Stat-R
obwohl ich noch nicht herausgefunden habe, wie man Skalen und sein show_col bekommt, um die (hex oder was auch immer anderes Format) Werte auszuspucken, die es zeichnet ...
Stefano