2011-05-20 12 views
19

Ggplot2'de çubuk grafik olarak çizdiğim ve veri çerçevesindeki (df$type) bir sütuna göre renklendirdiğim bir R veri karememe (df) sahibim. Şu anda renkleri atamak için varsayılan boyama desenini (scale_fill_brewer) kullanıyorum.R, ggplot2'nin scale_fill_brewer'ındaki tek bir değerin renk değerini nasıl değiştiririm?

Renk siyahını bir değere nasıl atayabilirim (df$type == -1) ve kalan renkleri atamak için scale_fill_brewer öğesini kullanabilir miyim? (tüm diğer df $ türleri, X'in benzersiz değerlerin sayısı olan 1'den X'e kadar bir tamsayı kümesinin içinde yer alır)

Şimdiye kadar bunu, renk kümesini belirleyerek el ile yapabildim scale_fill_brewer N farklı öğeyi kullanır ve sonra rengi siyah olarak önceden scale_fill_manual'a geçirir.

rhg_cols1<- c("#000000","#F8766D","#7CAE00","#00BFC4","#C77CFF") 
ggplot(y=values,data=df, aes(x=name, fill=factor(type))) + 
    geom_bar()+ scale_fill_manual(values = rhg_cols1) 

sorun

elle scale_fill_brewer onaltılık değerleri endam bir altılı renk hesap makinesi kullanarak renkleri atamadan çalışan bir çözüme ihtiyacımız olduğudur. gibi

şey:

ggplot(y=values,data=df, aes(x=name, fill=factor(type))) + 
    geom_bar()+ scale_fill_brewer(value(-1, "black") 

teşekkür ederiz!

DÜZENLEME: çözüm ColorBrewer

ait "Set2"
+1

... oldukça zor olacak. Scale_fill_manual() 've diğerlerinin tam olmayan bir özellikteki vektörü, örn. scale_fill_manual (values ​​= c ('- 1' = 'black')) 've diğer renklerin her zamanki gibi otomatik olarak alınacağını anlayın. Detay için –

cevap

31

paket RColorBrewer için 30'dan fazla renk ve iş için çalışmalıdır paletleri içerir ve sizin seçtiğiniz bir renk paleti dönmek için işlevini brewer.pal kullanabilirsiniz. Örneğin

, 5 renk sıralı mavi palet:

library(RColorBrewer) 
my.cols <- brewer.pal(5, "Blues") 
my.cols 

[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C" 

Sen ?brewer.pal yardım dosyalarında geçerli paleti adlarının bir listesini alabilirsiniz. Bu isimler ColorBrewer web sitesindeki isimle uyuşmaktadır.

Artık kullanabilir veya sonuçları değiştirebilir ve önerildiği gibi scale_manual_fill kullanılarak ggplot bu geçirebilirsiniz:

my.cols[1] <- "#000000" 

library(ggplot2) 
df <- data.frame(x=1:5, type=1:5) 
ggplot(df, aes(x=x, fill=factor(type))) + 
    geom_bar(binwidth=1)+ 
    scale_fill_manual(values = my.cols) 

enter image description here

+0

+1 ... –

+0

Çok detaylı yanıtınız için teşekkür ederiz. Ne yazık ki Set2 sadece 8 renk döndürüyor ve bazı durumlarda bundan daha fazlasına sahibim. – wespiserA

+0

Evet, bildiğim kadarıyla, neredeyse tüm ColorBrewer paletlerinin 8 renk üst sınırı var. Ayrıca scale_fill_hue' deneyebilirsiniz. – Andrie

20

bu birçok (30+) farklı kategoriler arasında ayırt etmek gerekirse Muhtemelen projeyi stratejik olarak düşünmek için biraz daha zaman harcamalı ve daha fazla zaman harcamalısınız: gerçekte ayırt edilebilen bir dizi 30 renk (ler) ile gelmek neredeyse imkansız olacaktır (özellikle de platformdan bağımsız bir şekilde) oluşturma kanalı).

Temel olarak Set2 ve 30+ renklerle çalışacak bir çözüm bulunmamaktadır. CB paletlerinden bazıları (Set3 ve Paired; library(RColorBrewer); display.brewer.all(n=12)) 12 renge kadar izin verir.

düzenleme: OP, çok fazla kategori olduğunda kırılmayacak iyi, ayırt edici renklerle keşifsel veri analizi yapmak ister.

library(RColorBrewer) 
my.cols <- function(n) { 
    black <- "#000000" 
    if (n <= 9) { 
    c(black,brewer.pal(n-1, "Set2")) 
    } else { 
    c(black,hcl(h=seq(0,(n-2)/(n-1), 
        length=n-1)*360,c=100,l=65,fixup=TRUE)) 
    } 
} 

library(ggplot2) 
d <- data.frame(z=1:10) 
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none") 
g1 + scale_colour_manual(values=my.cols(9)) 
g1 + scale_colour_manual(values=my.cols(10)) 
## check that we successfully recreated ggplot2 internals 
## g1+scale_colour_discrete() 

Ben bu şekilde makul çalışır düşünüyorum (eğer yerine olabilir Set3 ve 13 renk cutoff eğer tercih edilir): Ben bu satırlar boyunca bir şey önermek istiyorum.Tek dezavantajı (aklıma gelebilir), 9 ve 10 renk ile parseller arasındaki süreksizliktir. programlı bir şekilde N ayırt renklerin setleri toplama için daha iyi bir çözüm ile geliyor

Sadece aynı merak ediyordum

+0

içine şekillendirir, teşekkür ederim kullanmaktır senin zamanın için. – wespiserA

+2

daha ilginç/zorlu çözüm tüm parlaklık = 65 HCL kama içinde düşme ve olabildiğince eşit birbirlerinden mümkün olduğunca uzak/ayrılmış noktaların kümesini bulmak üzere olacaktır. Önemsiz Değil ... –

+1

@ üzerinde takibi 'rainbow_hcl' yukarıda Ben'in yorum, ** colorspace ** paket kolay eşit aralıklı HCL renklerin paletleri oluşturmak için yapar. Örneğin: 'kütüphane (colorspace); arsa (1:10, col = gökkuşağı_hcl (n = 10, c = 100, l = 65), pch = 16, cex = 6). –

İlgili konular