Ik ben een categorische dataset aan het plotten en wil onderscheidende kleuren gebruiken om verschillende categorieën weer te geven. Gegeven een getal n
, hoe kan ik het n
aantal MEEST onderscheidende kleuren in R krijgen? Bedankt.
Antwoord 1, autoriteit 100%
Ik heb me aangesloten bij alle kwalitatieve paletten van het RColorBrewer
pakket. Kwalitatieve paletten zouden elk X de meest onderscheidende kleuren moeten bieden. Door ze te mengen, worden ze natuurlijk ook in één palet samengevoegd, maar dat is het beste dat ik kan krijgen (74 kleuren).
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))
Een andere oplossing is: neem alle R-kleuren van grafische apparaten en neem er monsters van. Ik heb grijstinten verwijderd omdat ze te veel op elkaar lijken. Dit geeft 433 kleuren
color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
pie(rep(1,n), col=sample(color, n))
met 200 kleuren n = 200
:
pie(rep(1,n), col=sample(color, n))
Antwoord 2, autoriteit 62%
Hier zijn een paar opties:
-
Kijk eens naar de functie
palette
:palette(rainbow(6)) # six color rainbow (palette(gray(seq(0,.9,len = 25)))) #grey scale
-
En de functie
colorRampPalette
:##Move from blue to red in four colours colorRampPalette(c("blue", "red"))( 4)
-
Bekijk het
RColorBrewer
-pakket(en website). Als je afwijkende kleuren wilt, selecteer dan divergerenop de site. Bijvoorbeeld,library(RColorBrewer) brewer.pal(7, "BrBG")
-
De I want huewebsite geeft veel mooie paletten. Nogmaals, selecteer gewoon het palet dat je nodig hebt. U kunt bijvoorbeeld de RGB-kleuren van de site halen en uw eigen palet maken:
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)))
Antwoord 3, autoriteit 38%
Je kunt ook het randomcoloR
-pakket:
proberen
library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)
Je kunt zien dat er een reeks zeer verschillende kleuren is gekozen wanneer je deze visualiseert in een cirkeldiagram (zoals gesuggereerd door andere antwoorden hier):
pie(rep(1, n), col=palette)
Getoond in een cirkeldiagram met 50 kleuren:
n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)
Antwoord 4, autoriteit 17%
Geen antwoord op de vraag van OP, maar het is de moeite waard om te vermelden dat er de viridis
pakket dat goede kleurenpaletten heeft voor sequentiële data. Ze zijn perceptueel uniform, kleurenblind veilig en printervriendelijk.
Om het palet te krijgen, installeert u gewoon het pakket en gebruikt u de functie viridis_pal()
. Er zijn vier opties “A”, “B”, “C” en “D” om uit te kiezen
install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n) # n = number of colors seeked
Er is ook een uitstekende lezing waarin de complexiteit van goede kleurenkaarten op YouTube wordt uitgelegd:
Antwoord 5, autoriteit 10%
U kunt colorRampPalette
uit het basis- of RColorBrewer
-pakket gebruiken:
Met colorRampPalette
kunt u kleuren als volgt specificeren:
colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"
U kunt ook hexadecimale codes opgeven:
colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...
Met RColorBrewer
kunt u kleuren uit reeds bestaande paletten gebruiken:
require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"
Bekijk het RColorBrewer
pakket voor andere beschikbare paletten. Ik hoop dat dit helpt.
Antwoord 6, autoriteit 8%
Ik zou aanraden om een externe bron te gebruiken voor grote kleurenpaletten.
http://tools.medialab.sciences-po.fr/iwanthue/
heeft een service om een palet samen te stellen volgens verschillende parameters en
bespreekt het algemene probleem vanuit het perspectief van grafisch ontwerpers en geeft veel voorbeelden van bruikbare paletten.
Om een palet uit RGB-waarden te maken, hoeft u alleen de waarden in een vector te kopiëren zoals in bijvoorbeeld:
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")
Antwoord 7, autoriteit 6%
Ik heb een website gevonden met een lijst van 20 onderscheidende kleuren: 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')
Je kunt het proberen!
Antwoord 8, autoriteit 3%
U kunt hiervoor het pakket Polychromegebruiken. Het vereist alleen het aantal kleuren en een paar seedcolors
. Bijvoorbeeld:
# install.packages("Polychrome")
library(Polychrome)
# create your own color palette based on `seedcolors`
P36 = createPalette(36, c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)
U kunt meer informatie over dit pakket vinden op https://www.jstatsoft.org/article /view/v090c01.
Antwoord 9
Naar mijn idee is het zoeken naar onderscheidende kleuren gerelateerd aan efficiënt zoeken vanuit een eenheidskubus, waarbij drie dimensies van de kubus drie vectoren zijn langs de rode, groene en blauwe assen. Dit kan worden vereenvoudigd om in een cilinder te zoeken (HSV-analogie), waar u verzadiging (S) en waarde (V) vastlegt en willekeurige tintwaarden vindt. Het werkt in veel gevallen, en zie dit hier:
https://martin. ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
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)
}
Een alternatieve manier is om het R-pakket “uniform” te gebruiken
https://cran.r-project.org/web/packages/ uniformly/index.html
en deze eenvoudige functie kan onderscheidende kleuren genereren:
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])
}
Je kunt een iets meer betrokken functie bedenken door te zoeken in een raster:
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]
}
controleer deze functies door:
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
Houd er echter rekening mee dat het definiëren van een duidelijk palet met voor mensen waarneembare kleuren niet eenvoudig is. Welke van de bovenstaande benaderingen een diverse kleurenset genereert, moet nog worden getest.
Antwoord 10
U kunt een reeks kleuren als volgt genereren:
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")
Deze kleuren zijn zo duidelijk mogelijk. Voor die vergelijkbare kleuren vormen ze een verloop zodat je gemakkelijk de verschillen ertussen kunt zien.