Ich zeichne einen kategorialen Datensatz und möchte verschiedene Farben verwenden, um verschiedene Kategorien darzustellen. Bei einer Zahl n
, wie kann ich n
Anzahl der markantesten Farben in R? Vielen Dank.
Ich zeichne einen kategorialen Datensatz und möchte verschiedene Farben verwenden, um verschiedene Kategorien darzustellen. Bei einer Zahl n
, wie kann ich n
Anzahl der markantesten Farben in R? Vielen Dank.
Antworten:
Ich habe alle qualitativen Paletten aus dem RColorBrewer
Paket 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))
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)]
pie(rep(1,n), col=sample(color, n))
mit 200 Farben n = 200
:
pie(rep(1,n), col=sample(color, n))
col
entsprechende Farbnamen umzuwandeln ?
col
meinst du? Das color
von Grafikgeräten hat Namen. Wenn Sie im Allgemeinen meinen, haben nicht alle Hex-Codes entsprechende Farbnamen (es gibt nur 433 Farben in, grDevices
aber viele weitere Hex-Codes)
col=sample(col_vector, n)
aus dem RColorBrewer
Paket in Ihrem Code-Snippet. Beispiel: So finden Sie die Farbnamen für #B3E2CD, #E78AC3, #B3DE69
verfügbar unter sample(col_vector,3)
. Alternativ finden Sie alle Hex-Codes, die von brewer.pal
function mit ihren Farbnamen angegeben wurden.
RColorBrewer
Paletten nicht von grDevices
Farben abgeleitet sind, deren Namen zugeordnet sind, sondern nur Hex-Codes sind, können Sie dies meines Wissens nicht mit RColorBrewer
Paletten tun , auch nicht mit qualitativen.
Hier sind einige Optionen:
Schauen Sie sich die palette
Funktion an:
palette(rainbow(6)) # six color rainbow
(palette(gray(seq(0,.9,len = 25)))) #grey scale
Und die colorRampPalette
Funktion:
##Move from blue to red in four colours
colorRampPalette(c("blue", "red"))( 4)
Schauen Sie sich das colorBrewer
Paket (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")
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)))
I want hue
ist 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?
i want hue
es eine API gäbe, mit der es automatisch abgefragt werden könnte (vielleicht schon - ich habe nicht lange gesucht)
Sie können das randomcoloR
Paket 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)
Dargestellt in einem Kreisdiagramm mit 50 Farben:
n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)
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) ...
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
Es gibt auch einen ausgezeichneten Vortrag, der die Komplexität guter Farbkarten auf YouTube erklärt:
Sie können colorRampPalette
von Basis oder RColorBrewer
Paket verwenden:
Mit colorRampPalette
kö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 RColorBrewer
Sie Farben aus bereits vorhandenen Paletten verwenden:
require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"
RColorBrewer
Weitere verfügbare Paletten finden Sie im Paket. Hoffe das hilft.
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.
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
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")
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!
n
unverwechselbare Farben zu erzeugen, nicht um eine Reihe definierter Farben. Versuchen Sie, Ihre Antwort zu aktualisieren
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.
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.
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 .