2013-09-26 11 views
5

Örneğin, rengi z ile eşleştirmek ve 0 eşlemi "beyaz" ile eşlemek istiyorum. Eğer renk yerine değerlerin nasıl dağıtıldığı hakkında genel bir fikir vermektense, gerçekten yararlı bir göstergesi değildir görebileceğiniz gibiScale_fill_gradient kullanırken aşırı değerleri/dağıtımı yürütmek için diğer yaklaşımlar?

> a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12)) 
> a 
    x y   z 
1 1 1 -0.4603911 
2 2 1 -0.4868471 
3 3 1 0.2180346 
4 4 1 -0.8807652 
5 5 1 1.7379462 
6 6 1 -0.1334904 
7 7 1 -0.3675578 
8 8 1 0.9225425 
9 9 1 -12.0000000 
10 10 1 12.0000000 

ggplot(a,aes(x=x,y=y,fill=z)) + geom_bar(stat="identity") + 
    scale_fill_gradient2(high="green", mid="white", low="red") 

, şimdi renk sadece hangi değerlerin eğitimsiz gözle ayırt edilemez çoğunluk değerlerini bırakarak ekstrem söyler .

bir yöntem Non-linear color distribution over the range of values in a geom_raster yoktur ama biraz karmaşık görünüyor ve sadece belli belirsiz nasıl çalıştığını anlayabiliriz.

enter image description here

o zaman belki order dolayısıyla iyi bir rescale yoldur düşündüm:

ggplot(a,aes(x=x,y=y,fill=ecdf(z)(z))) + geom_bar(stat="identity") + 
scale_fill_gradient2(high="green", mid="white", low="red", midpoint=ecdf(a$z)(0)) 

Bu bir dereceye kadar çalıştı (burada yeniden ölçeklemek ne tür bir değer 0 bulmak için ecdf yerine order kullandı. Ancak, dezavantajı ise, efsanenin etiketlerini yeniden ölçeklendirilmiş olanlar yerine ölçeklendirilmemiş değerler olarak tutmak istiyorum.O yüzden labels=function(x) quantile(a$z, x) gibi bir şey yapamayacağımı düşünüyorum.Ayrıca, ecdf'u tekrar tekrar kullanarak aptalca buluyorum ve quantile ileri ve geri doğru geri çekilir. Bu gibi durumlarda daha iyi veya daha basit bir yaklaşım var mıdır, örn. Haritalanmış değerlerin her türlü dağılımı için makul renkleri doldurmaya yetecek kadar sağlam (optimum veya çok doğru olması gerekmez).

enter image description here

cevap

3

bildiğim kolay bir yolu yok, ama sen scale_fill_gradientn ile haritalama tam kontrole sahip olabilir. Buradaki anahtar, 0 değerinizdeki değerlerin 0 değerine, yani minimum değeriniz olan değerlere eşleştirilmesidir.

library(ggplot2) 
a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12)) 
get_col <- colorRamp(c("red", "white", "green")) # make fun to interpolate colors 
quantiles <- (0:6)/6       # how many quantiles we want to map 
quantile.vals <- quantile(a$z, quantiles, names=F)# the values for each quantile 
colours <- rgb(get_col(quantiles), max=255)  # 7 evenly interpolated colors 
val.remap <- (quantile.vals - min(a$z))/
    diff(range(a$z))        # The values corresponding to the quantiles 

ggplot(a, aes(x=x,y=y,fill=z)) + 
    geom_bar(stat="identity") + 
    scale_fill_gradientn(
    colours=colours, 
    values=val.remap, 
    breaks=quantile.vals,# Necessary to get legend values spread appropriately 
    guide="legend")  # Necessary to get legend values spread appropriately 

Burada değerlerin dağılımına dayalı değerlere eşit interpolated renkleri atamak seçti: İşte bir seçenektir. Dolayısıyla, eğer bir değer aralığı, minimum-maksimum aralığın nispeten küçük bir bölümünü yaysa da, bir dağılımın büyük bir kısmına karşılık gelirse, daha fazla renk tahsis edilecektir.

Sıfıra belirli bir renk atamak isterseniz, colours, values ve breaks bağımsız değişkenlerine karşılık gelen vektörleri düzenleyerek bunu yapabilirsiniz. Bu, sıfırın üstünde ve altında aynı sayıda değere sahipseniz, rahatsız edici değilse, önemsizdir.


şekli beyaz/0 grubu W:

library(ggplot2) 
a <- data.frame(x=1:10, y=1, z=c(rnorm(8), -12, 12)) 
splits <- 7  # should be odd number 
mid.point <- 0 
pos.vals <- a$z[a$z > mid.point] 
neg.vals <- a$z[a$z < mid.point] 
pos.quants <- quantile(c(mid.point, pos.vals), 0:((splits - 1)/2)/((splits - 1)/2), names=F) 
neg.quants <- quantile(c(mid.point, neg.vals), 0:((splits - 1)/2)/((splits - 1)/2), names=F) 
quants <- c(neg.quants, pos.quants[-1]) # drop of the mid-point from pos.quants since otherwise double counted 

get_col <- colorRamp(c("red", "white", "green")) # make fun to interpolate colors 
colours <- rgb(get_col(0:(splits - 1)/(splits - 1)), max=255)  # 7 evenly interpolated colors 
val.remap <- (quants - min(quants))/
    diff(range(quants))        # The values corresponding to the quantiles 

ggplot(a, aes(x=x,y=y,fill=z)) + 
    geom_bar(stat="identity") + 
    scale_fill_gradientn(
    colours=colours, 
    values=val.remap, 
    breaks=quants, 
    guide="legend") 

color mapping result http://i42.tinypic.com/qzmzgn.png

İlgili konular