Kategorik bir veri kümesi çiziyorum ve farklı kategorileri temsil etmek için farklı renkler kullanmak istiyorum. Bir sayı verildiğinde , R'de ÇOK farklı renkleri n
nasıl elde edebilirim n
? Teşekkürler.
Kategorik bir veri kümesi çiziyorum ve farklı kategorileri temsil etmek için farklı renkler kullanmak istiyorum. Bir sayı verildiğinde , R'de ÇOK farklı renkleri n
nasıl elde edebilirim n
? Teşekkürler.
Yanıtlar:
Tüm kalitatif paletlere RColorBrewer
paketten 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))
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)]
pie(rep(1,n), col=sample(color, n))
200 renk ile n = 200
:
pie(rep(1,n), col=sample(color, n))
col
karşılık gelen renk isimlerine dönüştürme imkanı var mı ?
col
ne demek istiyorsun? color
grafik 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 grDevices
ancak birçok onaltılık kod vardır)
col=sample(col_vector, n)
dan RColorBrewer
Kod snippet'inizde paketin. Örneğin, nasıl için renk adlarını bulmak için #B3E2CD, #E78AC3, #B3DE69
edinilebilir sample(col_vector,3)
. Alternatif olarak, brewer.pal
işlev tarafından renk adlarıyla verilen tüm hex kodları nasıl bulunur?
RColorBrewer
paletler grDevices
renklerden türetilmediğinden, isimleri haritalanmış, ancak sadece onaltılık kodlar, bildiğim kadarıyla, bunu RColorBrewer
paletlerle, hatta kalitatif olanlarla bile yapamazsınız .
İşte birkaç seçenek:
İşleve bir göz atın palette
:
palette(rainbow(6)) # six color rainbow
(palette(gray(seq(0,.9,len = 25)))) #grey scale
Ve colorRampPalette
işlev:
##Move from blue to red in four colours
colorRampPalette(c("blue", "red"))( 4)
Bak colorBrewer
paketi (ve web ). Farklı renkler istiyorsanız , sitede farklılaşmayı seçin . Örneğin,
library(colorBrewer)
brewer.pal(7, "BrBG")
İ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)))
I want hue
harika 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?
i want hue
Otomatik olarak sorgulanmasına izin veren bir API olsaydı iyi olurdu (belki de yapar - uzun süre
randomcoloR
Paketi 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)
50 renkle bir pasta grafikte gösterilir:
n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)
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) ...
OP'nin sorusuna bir cevap değil, ancak viridis
sı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
YouTube'da iyi renk haritalarının karmaşıklığını açıklayan mükemmel bir konuşma da var:
colorRampPalette
Tabandan veya RColorBrewer
paketten kullanabilirsiniz :
İle colorRampPalette
renkleri ş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"
RColorBrewer
Mevcut diğer paletler için pakete bakın . Bu yardımcı olur umarım.
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.
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
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")
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!
n
bir dizi tanımlanmış renk değil, farklı renkler üretmekle ilgili olan soruyu yanıtlamaz . Cevabınızı güncellemeyi deneyin
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.
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.
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 .