2014-05-14 16 views
8

Na wykresie wygenerowanym poniższym kodem chciałbym zmienić kolory tak, aby wszystkie wartości < 0.6 były takie same jak "niski" kolor i wszystkie wartości większe niż 1 to "wysoki" kolor.R ggplot2 - Jak określić kolor poza granicami

W stanie zgodnym gradient kolorów rozciąga się na cały zakres liczbowy danych. Próbowałem dodawać limity, ale to sprawia, że ​​wszystkie wartości poza boiskiem są tego samego koloru, co wartości NA, co nie jest tym, czego potrzebuję, ponieważ potrzebuję brakujących wartości NA, aby wyraźnie się wystawały i nie wyglądają tego samego koloru, co wartości poza granicami < 0.6.

Jestem przekonany, że odpowiedź brzmi: oob, łamie argumenty, ale nie udało im się sprawić, by działało.

library(ggplot2) 
a = rnorm(17*17, 0.733,0.21) 
qcMat = matrix(a, ncol = 17) 
qcMat[qcMat> 1] = 1 
#qcMat contains values between 0 and 1 and some NAs 

m = melt(t(qcMat)) 
m$Var2 <- with(m,factor(Var2, levels = rev(sort(unique(Var2))))) 
ggplot(m, aes(as.factor(Var1), Var2, group=Var2)) + 
    geom_tile(aes(fill = value)) + 
    geom_text(aes(fill = m$value, label = round(m$value, 2))) + 
    scale_fill_gradient(low = "red", high = "green") + 
    xlab("") + ylab("") + ggtitle(paste("biscuit:", biscuit_id, "- QC", sep = " ")) 
+0

Piszesz „wszystkie wartości większe niż 1 są«wysokie»kolor” i " qcMat zawiera wartości od 0 do 1 i niektóre NA. Po co używać 1 jako limitu, gdy nie masz żadnych 1 w swoich danych? – Henrik

+0

@Henrik dane wygenerowane do celów tego fragmentu nie są prawdziwym odzwierciedleniem rzeczywistych danych, nad którymi pracuję, ale są bardzo blisko. Naprawiono również usuwanie dishMat. – HoaxKey

Odpowiedz

14

jak ty powiedziałem, chcesz argument oob w scale_fill_gradient. Aby zamocować wartości, można użyć squish from the scales package (scales jest instalowany po zainstalowaniu ggplot2):

library(scales) 

a później

scale_fill_gradient(low = "red", high = "green", limits=c(0.6, 1), oob=squish) 
+0

Genialny! Nie załadowałem pakietu wagi, ale próbowałem tej dokładnej poprawki poza tym. Tak blisko, ale bez cygara. Pozdrawiam Stefano! – HoaxKey

+0

Nie rozumiem tego przykładu. Gdzie jest określony kolor wartości poza zakresem? To sprawia, że ​​wartości nie są uważane za NA – GabrielMontenegro

0

Spróbuj zmienić geom_tile poniżej:

geom_tile(aes(fill = ifelse(value<0.6,min(m$value,na.rm=TRUE), 
           ifelse(value>1,max(m$value,na.rm=TRUE), 
            value)))) 

EDIT: Wtedy nie używać min max, więc będziemy mieli 0,6-1 gama:

geom_tile(aes(fill = ifelse(value<0.6,0.6, 
          ifelse(value>1,1, 
            value)))) 
+0

Dzięki zx8754 jest to zdecydowanie krok w prawo bezpośrednio, ale nie do końca doskonały, zaktualizowałem moje pytanie, aby odzwierciedlić sugestię i wyjaśnić nowy problem, który przedstawia. Twoje zdrowie! – HoaxKey

+0

@HoaxKey zaktualizowaną odpowiedź. – zx8754

+0

Zaktualizowane pytanie. Jest to jeszcze bliżej, ale nie do końca doskonałe. Naprawdę doceniam twoją pomoc z tym, nie przypuszczam, że jesteś użytkownikiem Dogecoina, który mógłbym dać napiwek? – HoaxKey

Powiązane problemy