Hoe genereer je een aantal meest onderscheidende kleuren in R?

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 naantal MEEST onderscheidende kleuren in R krijgen? Bedankt.


Antwoord 1, autoriteit 100%

Ik heb me aangesloten bij alle kwalitatieve paletten van het RColorBrewerpakket. 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:

  1. Kijk eens naar de functie palette:

    palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
    
  2. En de functie colorRampPalette:

    ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
    
  3. Bekijk het RColorBrewer-pakket(en website). Als je afwijkende kleuren wilt, selecteer dan divergerenop de site. Bijvoorbeeld,

    library(RColorBrewer)
     brewer.pal(7, "BrBG")
    
  4. 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 viridispakket 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:

Een betere standaardkleurenkaart voor Matplotlib | SciPy 2015 | Nathaniel Smith en Stéfan van der Walt


Antwoord 5, autoriteit 10%

U kunt colorRampPaletteuit het basis- of RColorBrewer-pakket gebruiken:

Met colorRampPalettekunt 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 RColorBrewerkunt 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 RColorBrewerpakket 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

https://graphicdesign.stackexchange.com/questions/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

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.

Other episodes