Wie kann man in R eine Reihe von markantesten Farben erzeugen?


Antworten:


108

Ich habe alle qualitativen Paletten aus dem RColorBrewerPaket zusammengefügt. Qualitative Paletten sollen jeweils X markanteste Farben liefern. Wenn Sie sie mischen, werden natürlich auch ähnliche Farben zu einer Palette zusammengefasst, aber das ist das Beste, was ich bekommen kann (74 Farben).

library(RColorBrewer)
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
pie(rep(1,n), col=sample(col_vector, n))

colour_Brewer_qual_60

Eine andere Lösung ist: Nehmen Sie alle R-Farben von Grafikgeräten und probieren Sie sie aus. Ich habe Graustufen entfernt, da sie zu ähnlich sind. Dies ergibt 433 Farben

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]

Satz von 20 Farben

pie(rep(1,n), col=sample(color, n))

mit 200 Farben n = 200:

pie(rep(1,n), col=sample(color, n))

Satz von 200 Farben


Gibt es eine Möglichkeit, die Hex-Codes in colentsprechende Farbnamen umzuwandeln ?
Prradep

@ Prradep was colmeinst du? Das colorvon Grafikgeräten hat Namen. Wenn Sie im Allgemeinen meinen, haben nicht alle Hex-Codes entsprechende Farbnamen (es gibt nur 433 Farben in, grDevicesaber viele weitere Hex-Codes)
JelenaČuklina

Ich erwähne ungefähr col=sample(col_vector, n)aus dem RColorBrewerPaket in Ihrem Code-Snippet. Beispiel: So finden Sie die Farbnamen für #B3E2CD, #E78AC3, #B3DE69verfügbar unter sample(col_vector,3). Alternativ finden Sie alle Hex-Codes, die von brewer.palfunction mit ihren Farbnamen angegeben wurden.
Prradep

2
@Prradep, da RColorBrewerPaletten nicht von grDevicesFarben abgeleitet sind, deren Namen zugeordnet sind, sondern nur Hex-Codes sind, können Sie dies meines Wissens nicht mit RColorBrewerPaletten tun , auch nicht mit qualitativen.
JelenaČuklina

1
@ytu dann sind die Farben nicht unterscheidbar. Wenn es absolut notwendig ist, würde ich vorschlagen, in R nach "Verlaufserstellung" zu suchen und dann eine zufällige Auswahl von Farben zu verwenden. Aber die Zuordnung von Farben zu Faktoren funktioniert nicht. Die menschliche Wahrnehmung kann mit 20 bis 40 Farben umgehen, der Rest ist nicht viel anders.
JelenaČuklina

70

Hier sind einige Optionen:

  1. Schauen Sie sich die paletteFunktion an:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. Und die colorRampPaletteFunktion:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. Schauen Sie sich das colorBrewerPaket (und die Website ) an. Wenn Sie unterschiedliche Farben wünschen, wählen Sie auf der Site die Option Abweichend . Beispielsweise,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. Die I want hue -Website bietet viele schöne Paletten. Wählen Sie erneut die gewünschte Palette aus. Sie können beispielsweise die RGB-Farben von der Site abrufen und Ihre eigene Palette erstellen:

     palette(c(rgb(170,93,152, maxColorValue=255),
         rgb(103,143,57, maxColorValue=255),
         rgb(196,95,46, maxColorValue=255),
         rgb(79,134,165, maxColorValue=255),
         rgb(205,71,103, maxColorValue=255),
         rgb(203,77,202, maxColorValue=255),
         rgb(115,113,206, maxColorValue=255)))

Danke für deine Antwort. Es erzeugt Farben, von denen einige jedoch nicht sehr unterschiedlich sind. Vielleicht hätte ich das in meinen Fragen mehr betonen sollen.
RNA

1
@ RNAer Ich habe meine Antwort aktualisiert. Sie können die Vorschläge 3 und 4 verwenden, um unterschiedliche Paletten zu erhalten.
Csgillespie

1
I want hueist eine tolle Website. Genau das will ich. Geben Sie anhand einer bestimmten Zahl eine Palette mit der Anzahl der Farben an. aber können wir es in R automatisch tun?
RNA

Es ist großartig. Es gibt jedoch eine Menge Maschinen hinter dieser Website. Ich denke nicht, dass es trivial sein wird, erneut zu implementieren. Es wäre schön, wenn i want huees eine API gäbe, mit der es automatisch abgefragt werden könnte (vielleicht schon - ich habe nicht lange gesucht)
Ben Bolker

8
@BenBolker - Ich habe einen Kern für eine R - Version gemacht i want hue, hier . Die Effizienz könnte verbessert werden (z. B. durch Speichern von Farbmustern als Datenobjekte), aber die allgemeine Idee ist da. (Laden mit devtools::source_gist('45b49da5e260a9fc1cd7'))
jbaums

36

Sie können das randomcoloRPaket auch ausprobieren :

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)

Sie können sehen, dass bei der Visualisierung in einem Kreisdiagramm eine Reihe sehr unterschiedlicher Farben ausgewählt werden (wie in anderen Antworten hier vorgeschlagen):

pie(rep(1, n), col=palette)

Geben Sie hier die Bildbeschreibung ein

Dargestellt in einem Kreisdiagramm mit 50 Farben:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)

Geben Sie hier die Bildbeschreibung ein


3
Vielen Dank. Ich musste verwenden unname(distinctColorPalette(n)), um diese Arbeit mit ggplot zu machen. Ich denke, ggplot braucht einen unbenannten Vektor. col_vector <- unname(distinctColorPalette(n))und dann... + scale_color_manual(values=col_vector) ...
Gaurav

19

Keine Antwort auf die Frage von OP, aber es ist erwähnenswert, dass es die gibt viridis Paket gibt, das gute Farbpaletten für sequentielle Daten enthält. Sie sind wahrnehmungsmäßig einheitlich, farbenblind und sicher und druckerfreundlich.

Um die Palette zu erhalten, installieren Sie einfach das Paket und verwenden Sie die Funktion viridis_pal(). Es stehen vier Optionen "A", "B", "C" und "D" zur Auswahl

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Es gibt auch einen ausgezeichneten Vortrag, der die Komplexität guter Farbkarten auf YouTube erklärt:

Eine bessere Standard-Farbkarte für Matplotlib | SciPy 2015 | Nathaniel Smith und Stéfan van der Walt


17
Dies ist nicht so geeignet für markante Farben.
Christopher John

13

Sie können colorRampPalettevon Basis oder RColorBrewerPaket verwenden:

Mit colorRampPalettekönnen Sie Farben wie folgt angeben:

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

Alternativ können Sie auch Hex-Codes angeben:

colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...

Mit können RColorBrewerSie Farben aus bereits vorhandenen Paletten verwenden:

require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"

RColorBrewerWeitere verfügbare Paletten finden Sie im Paket. Hoffe das hilft.


1
Vielen Dank. Ich mag die letzte Option brewer.pal. Es ist jedoch auf 9 Farben begrenzt. Ich habe tatsächlich mehr als 9 Kategorien. Die ersten Alternativen erzeugen Verlaufsfarben, die nicht so ausgeprägt sind, wie ich es möchte.
RNA

2
Sie können nicht viele "unterschiedliche" Farben auswählen. Sie können maximal 12 bekommen, nehme ich an. Sie sollten colorbrewer2.org überprüfen und die Farben erhalten (es gibt 1 12 Farbpalette, wenn ich recht habe).
Arun

Es wird schwierig sein, nach mehr als 12 markanten Farben zu suchen - ich denke, darüber wird auf der Colorbrewer-Seite
diskutiert

Das ist in Ordnung, solange es sich um die "markantesten" Farben handelt, die es gibt, auch wenn sie mit steigender Anzahl weniger markant werden.
RNA

3
Wenn Ihr Problem bei der Zuordnung zu benachbarten Kategorien nebeneinander ähnliche Farben aufweist (wie dies bei der Regenbogenpalette der Fall ist), können Sie die Regenbogenausgabe einfach wie folgt randomisieren: Regenbogen (n = 10) [Beispiel (10)]
David Roberts

11

Ich würde empfehlen, eine externe Quelle für große Farbpaletten zu verwenden.

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

hat einen Dienst, um jede Größe der Palette nach verschiedenen Parametern und zusammenzustellen

/graphicdesign/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

Erläutert das allgemeine Problem aus Sicht der Grafikdesigner und gibt viele Beispiele für verwendbare Paletten.

Um eine Palette aus RGB-Werten zu erstellen, müssen Sie nur die Werte in einen Vektor kopieren, wie z.

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

3

Ich habe eine Website mit einer Liste von 20 verschiedenen Farben gefunden: 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')

Sie können es versuchen!


1
Dies beantwortet nicht wirklich die Frage, bei der es darum geht, n unverwechselbare Farben zu erzeugen, nicht um eine Reihe definierter Farben. Versuchen Sie, Ihre Antwort zu aktualisieren
Michal

1

Sie können eine Reihe von Farben wie folgt generieren:

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

Diese Farben sind so unterschiedlich wie möglich. Für diese ähnlichen Farben bilden sie einen Farbverlauf, sodass Sie die Unterschiede zwischen ihnen leicht erkennen können.


0

Nach meinem Verständnis hängt die Suche nach bestimmten Farben mit der effizienten Suche aus einem Einheitswürfel zusammen, wobei drei Dimensionen des Würfels drei Vektoren entlang der roten, grünen und blauen Achse sind. Dies kann vereinfacht werden, um in einem Zylinder zu suchen (HSV-Analogie), in dem Sie Sättigung (S) und Wert (V) festlegen und zufällige Farbtonwerte finden. Es funktioniert in vielen Fällen und sehen Sie dies hier:

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

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

Eine alternative Möglichkeit besteht darin, das R-Paket "einheitlich" zu verwenden: https://cran.r-project.org/web/packages/uniformly/index.html

und diese einfache Funktion kann unverwechselbare Farben erzeugen:

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

Man kann sich bei der Rastersuche eine etwas komplexere Funktion vorstellen:

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

Überprüfen Sie diese Funktionen durch:

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

Beachten Sie jedoch, dass das Definieren einer bestimmten Palette mit vom Menschen wahrnehmbaren Farben nicht einfach ist. Welcher der oben genannten Ansätze unterschiedliche Farbsätze erzeugt, muss noch getestet werden.


0

Sie können das Polychrome- Paket für diesen Zweck verwenden. Es erfordert nur die Anzahl der Farben und einige seedcolors. Beispielsweise:

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

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

Weitere Informationen zu diesem Paket finden Sie unter https://www.jstatsoft.org/article/view/v090c01 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.