R'de bir dizi en belirgin renk nasıl oluşturulur?


Yanıtlar:


108

Tüm kalitatif paletlere RColorBrewerpaketten katıldım . Niteliksel paletlerin her biri en belirgin X rengi sağlaması beklenir. Tabii ki, onları karıştırmak aynı renkte tek bir palette birleşiyor, ama alabildiğim en iyisi bu (74 renk).

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

Diğer çözüm ise: tüm R renklerini grafik cihazlardan almak ve bunlardan örnek almaktır. Çok benzer olduklarından gri tonlarını kaldırdım. Bu 433 renk verir

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

20 renk seti

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

200 renk ile n = 200:

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

200 renk seti


Hex kodları colkarşılık gelen renk isimlerine dönüştürme imkanı var mı ?
Prradep

@Prradep colne demek istiyorsun? colorgrafik cihazlardan adları bulunmaktadır. Genel olarak şunu kastediyorsanız, tüm onaltılık kodlar karşılık gelen renk adlarına sahip değildir (yalnızca 433 renk vardır grDevicesancak birçok onaltılık kod vardır)
JelenaČuklina

Ben bahsederken am col=sample(col_vector, n)dan RColorBrewerKod snippet'inizde paketin. Örneğin, nasıl için renk adlarını bulmak için #B3E2CD, #E78AC3, #B3DE69edinilebilir sample(col_vector,3). Alternatif olarak, brewer.palişlev tarafından renk adlarıyla verilen tüm hex kodları nasıl bulunur?
Prradep

2
@Prradep, RColorBrewerpaletler grDevicesrenklerden türetilmediğinden, isimleri haritalanmış, ancak sadece onaltılık kodlar, bildiğim kadarıyla, bunu RColorBrewerpaletlerle, hatta kalitatif olanlarla bile yapamazsınız .
JelenaČuklina

1
@ytu sonra renkler ayırt edilemez. Kesinlikle gerekliyse, R'de "gradyan oluşturma" aramayı ve ardından rastgele renk örneklemesini kullanmanızı öneririm. Ancak renklerden faktörlere eşleştirme işe yaramayacak, insan algısı belki 20-40 rengi kaldırabilir, gerisi o kadar da farklı değil.
JelenaČuklina

70

İşte birkaç seçenek:

  1. İşleve bir göz atın palette:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. Ve colorRampPaletteişlev:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. Bak colorBrewerpaketi (ve web ). Farklı renkler istiyorsanız , sitede farklılaşmayı seçin . Örneğin,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. İstediğim renk web sitesi güzel paletleri çok verir. Yine, ihtiyacınız olan paleti seçin. Örneğin siteden rgb renklerini alıp kendi paletinizi oluşturabilirsiniz:

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

Cevabınız için teşekkürler. Renkler üretir, ancak bazıları birbirinden çok farklı değildir. belki sorularımda buna daha çok vurgu yapmalıydım.
RNA

1
@RNAer Cevabımı güncelledim. Farklı paletler almak için 3. ve 4. önerileri kullanabilirsiniz .
csgillespie

1
I want hueharika bir web sitesidir. Bu tam olarak istediğim şey. Bir sayı verildiğinde, renk sayısının bir paleti nasıl oluşturulur. ama bunu otomatik olarak R'de yapabilir miyiz?
RNA

Bu mükemmel. Ancak, bu web sitesinin arkasında çok sayıda makine var. Yeniden uygulamanın önemsiz olacağını sanmıyorum. i want hueOtomatik olarak sorgulanmasına izin veren bir API olsaydı iyi olurdu (belki de yapar - uzun süre
bakmadım

8
@BenBolker - Ben bir R versiyonu için özünü yaptık i want hue, burada . Verimlilik geliştirilebilir (örn. Renk örneklerini veri nesneleri olarak kaydederek), ancak genel fikir orada. ( devtools::source_gist('45b49da5e260a9fc1cd7')
İle

36

randomcoloRPaketi de deneyebilirsiniz :

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

Bir pasta grafikte görselleştirirken oldukça farklı bir renk kümesinin seçildiğini görebilirsiniz (buradaki diğer yanıtların önerdiği gibi):

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

görüntü açıklamasını buraya girin

50 renkle bir pasta grafikte gösterilir:

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

görüntü açıklamasını buraya girin


3
Teşekkürler. Bunun unname(distinctColorPalette(n))ggplot ile çalışmasını sağlamak için kullanmak zorunda kaldım. Sanırım ggplot'un isimsiz bir vektöre ihtiyacı var. col_vector <- unname(distinctColorPalette(n))ve sonra... + scale_color_manual(values=col_vector) ...
Gaurav

19

OP'nin sorusuna bir cevap değil, ancak viridissıralı veriler için iyi renk paletlerine sahip bir paket olduğundan bahsetmeye değer . Algısal olarak tek tip, renk körü güvenlidir ve yazıcı dostudur.

Paleti almak için paketi kurun ve işlevi kullanın viridis_pal(). Seçebileceğiniz dört seçenek "A", "B", "C" ve "D" vardır

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

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

YouTube'da iyi renk haritalarının karmaşıklığını açıklayan mükemmel bir konuşma da var:

Matplotlib için Daha İyi Bir Varsayılan Colormap | SciPy 2015 | Nathaniel Smith ve Stéfan van der Walt


17
Bu, farklı renkler için pek uygun değil.
Christopher John

14

colorRampPaletteTabandan veya RColorBrewerpaketten kullanabilirsiniz :

İle colorRampPaletterenkleri şu şekilde belirtebilirsiniz:

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

Alternatif olarak onaltılık kodlar da sağlayabilirsiniz:

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

İle RColorBrewerönceden var olan paletlerdeki renkleri kullanabilirsiniz:

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

RColorBrewerMevcut diğer paletler için pakete bakın . Bu yardımcı olur umarım.


1
Teşekkürler. Son seçeneği beğendim brewer.pal. ancak 9 renk ile sınırlıdır. Aslında 9'dan fazla kategorim var. İlk alternatifler, istediğim kadar ayırt edici olmayan bir degrade renkler oluşturur.
RNA

2
birçok "farklı" renk seçemezsiniz. Sanırım en fazla 12 tane alabilirsin. Dışarı kontrol etmelisiniz colorbrewer2.org (eğer haklıysam 1 12 renk paleti var) ve renkleri olsun.
Arun

12'den fazla farklı renklendirme aramak zor olacak - sanırım bununla ilgili renkli bira üreticisi sayfasında tartışma var
alexwhan

Bu sorun değil, mevcut "en" ayırt edici renkler oldukları sürece, sayı arttıkça daha az belirgin hale geliyorlar.
RNA

3
Sorununuz, bitişik kategorilere atandığında yan yana benzer renkler ise (gökkuşağı paletinin yapacağı gibi), gökkuşağı çıktısını şu şekilde rastgele hale getirebilirsiniz: gökkuşağı (n = 10) [örnek (10)]
David Roberts

11

Büyük renk paletleri için harici bir kaynak kullanmanızı tavsiye ederim.

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

çeşitli parametrelere göre her boyutta paleti oluşturmak için bir hizmete sahiptir ve

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

Genel problemi grafik tasarımcılarının bakış açısından tartışır ve çok sayıda kullanılabilir palet örneği verir.

RGB değerlerinden bir palet oluşturmak için bir vektördeki değerleri örneğin aşağıdaki gibi kopyalamanız yeterlidir:

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

20 farklı renk listesi sunan bir web sitesi buldum: 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')

Bir deneyebilirsin!


1
Bu, n bir dizi tanımlanmış renk değil, farklı renkler üretmekle ilgili olan soruyu yanıtlamaz . Cevabınızı güncellemeyi deneyin
Michal

1

Bunun gibi bir dizi renk oluşturabilirsiniz:

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

Bu renkler olabildiğince farklıdır. Bu benzer renkler için, aralarındaki farkları kolayca anlayabilmeniz için bir gradyan oluştururlar.


0

Anladığım kadarıyla ayırt edici renkleri aramak, küpün 3 boyutunun kırmızı, yeşil ve mavi eksenler boyunca üç vektör olduğu bir birim küpten verimli bir şekilde arama yapmakla ilgilidir. Bu, Doygunluk (S) ve Değeri (V) sabitlediğiniz ve rastgele Ton değerleri bulduğunuz bir silindirde (HSV benzetimi) arama yapmak için basitleştirilebilir. Çoğu durumda işe yarar ve şuna buradan bakın:

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

R'de,

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

Alternatif bir yol, R paketini "eşit şekilde" kullanmaktır https://cran.r-project.org/web/packages/uniformly/index.html

ve bu basit işlev, farklı renkler oluşturabilir:

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

Izgara arama ile biraz daha ilgili fonksiyon düşünülebilir:

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

bu işlevleri şu şekilde kontrol edin:

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

Bununla birlikte, insan tarafından algılanabilir renklerle farklı bir palet tanımlamanın kolay olmadığını unutmayın. Yukarıdaki yaklaşımlardan hangisinin farklı renk seti oluşturduğu henüz test edilmemiştir.


0

Sen kullanabilirsiniz Polikrom bu amaçla paketi. Sadece birkaç renk ve birkaç tane gerektirir seedcolors. Örneğin:

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

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

Bu paket hakkında daha fazla bilgiyi https://www.jstatsoft.org/article/view/v090c01 adresinde bulabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.