2014-10-15 13 views
6

Sorum, geom_tile kullanarak ısımağım için farklı bir renk istiyorum ve degrade rengi, ölçeğin iki ucuna göre değişir. Örneğin, tüm ölçek (-1,1), sadece -1'den -0.5'e kadar olan değerleri istiyorum ve 0,5'ten 1,0'a kadar olan değerler degrade renk varyasyonuna sahip ve -0,5 ile 0,5 arasındaki değerler beyaz olarak kalıyor. Ancak, hedefe ulaşmak için scale_fill_gradient numaralı telefondan bir seçenek bulamıyorum. Bir tekrarlanabilir örneği aşağıda gibidir ve veri ggplot2 heatmaps: using different gradients for categories1 "low" ve "high" belirtme ve scale_fill_gradient kullanarak iki uçta iki ölçek alma nasıl kullanılır?

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") 
nba$Name <- with(nba, reorder(Name, PTS)) 

library("ggplot2") 
library("plyr") 
library("reshape2") 
library("scales") 

nba.m <- melt(nba) 
nba.s <- ddply(nba.m, .(variable), transform, 
       rescale = scale(value)) 

ggplot(nba.s, aes(variable, Name))+geom_tile(aes(fill = rescale), colour = "white") + 
scale_fill_gradient(low = "darkgreen", high = "darkred") 

cevap

8

dan Sen scale_fill_gradient2 beyaz bir orta noktayı eklemeyi deneyebilirsiniz ise: En esnekliğe sahip olacak,

gg <- ggplot(nba.s, aes(variable, Name)) 
gg <- gg + geom_tile(aes(fill = rescale), colour = "white") 
gg <- gg + scale_fill_gradient2(low = "darkgreen", mid = "white", high = "darkred") 
gg <- gg + labs(x="", y="") 
gg <- gg + theme_bw() 
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank()) 
gg 

enter image description here

Ama Cevabı scale_fill_gradientn'a bağladığınız SO mesajında ​​takip ederseniz.

DÜZENLEME (yorum tartışmadan bir örnek göstermek için)

# change the "by" for more granular levels 

green_seq <- seq(-5,-2.000001, by=0.1) 
red_seq <- seq(2.00001, 5, by=0.1) 

nba.s$cuts <- factor(as.numeric(cut(nba.s$rescale, 
          c(green_seq, -2, 2, red_seq), include.lowest=TRUE))) 

# find "white" 
white_level <- as.numeric(as.character(unique(nba.s[nba.s$rescale >= -2 & nba.s$rescale <= 2,]$cuts))) 
all_levels <- sort(as.numeric(as.character(unique(nba.s$cuts)))) 

num_green <- sum(all_levels < white_level) 
num_red <- sum(all_levels > white_level) 

greens <- colorRampPalette(c("#006837", "#a6d96a")) 
reds <- colorRampPalette(c("#fdae61", "#a50026")) 

gg <- ggplot(nba.s, aes(variable, Name)) 
gg <- gg + geom_tile(aes(fill = cuts), colour = "white") 
gg <- gg + scale_fill_manual(values=c(greens(num_green), 
             "white", 
             reds(num_red))) 
gg <- gg + labs(x="", y="") 
gg <- gg + theme_bw() 
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank()) 
gg <- gg + theme(legend.position="bottom") 
gg 

enter image description here

efsane ideal olmaktan uzak, ancak potansiyel olarak başka yollarla bunu ya Bunun çevresinin dışında bırakabilirsiniz .

+0

Yanıtladığınız için teşekkür ederiz! Ancak, bu durumda -2 ile 2 arasındaki tüm değerlerin degrade etkisi olmadan tüm beyaza dönüşmesini istiyorum ... – MYjx

+0

Eğer bu ve gradyan çözümü işe yaramıyorsa, o zaman Değerlerin kendi "cut" değerlerini kendiniz oluşturun ve degrade renklerini "scale_fill_manual" ile manuel olarak belirtin. – hrbrmstr

+0

Evet denedim scale_fill_manual' işe yaradı ama her gün çok fazla veriye sahip olduğumda rengi her zaman belirtmek istemiyorum. Bu yüzden 'gradyan' kullanmak istiyorum. 'Breakks' kullanmayı denedim ama sadece efsane için değil renk için çalışıyor gibi görünüyor. – MYjx

İlgili konular