2012-12-15 16 views
17

Poszukuję sposobu na rozciągnięcie gradientu kolorów między dwiema wartościami i oznaczenie legendy, niezależnie od zakresu wartości danych w zbiorze danych. Zasadniczo istnieje funkcjonalny odpowiednik ylim() dla gradientów kolorów?Gradient koloru skali ggplot do zakresu spoza zakresu danych

danego kodu, które działki wartość az typowo od -1 do 1, mogę wykreślić i oznakować gradient jeśli przerwy są w zakresie danych:

require(ggplot2) 

#generator from http://docs.ggplot2.org/current/geom_tile.html 
pp <- function (n,r=4) { 
    x <- seq(-r*pi, r*pi, len=n) 
    df <- expand.grid(x=x, y=x) 
    df$r <- sqrt(df$x^2 + df$y^2) 
    df$z <- cos(df$r^2)*exp(-df$r/6) 
    df 
} 

t <- pp(30) 
summary(t) 
b <- c(-.5,0,.5) 
p <- ggplot(data=t,aes(x=x,y=y))+ 
    geom_tile(aes(fill=z))+ 
    scale_fill_gradientn(colours=c("navyblue","darkmagenta","darkorange1"),breaks=b,labels=format(b)) 
try(ggsave(plot=p,filename=<somefile.png>,height=3,width=4)) 

graham jeffries ggplot scale fill example

Ale kiedy zmienić łamie się do wartości spoza obserwowanego zakresu, kolory gradientu nie wydają się korygować, a etykiety gradientu nie pojawiają się.

b <- c(-3,0,3) 

graham jeffries ggplot scale fill example 2

Odpowiedz

37

To bardzo ważne, aby pamiętać, że w ggplot, breaks będzie w zasadzie nigdy się nie zmieniają samej skali. Zmieni tylko to, co jest wyświetlane w przewodniku lub legendzie.

Należy się zmieniać limity skali zamiast:

ggplot(data=t, aes(x=x, y=y)) + 
    geom_tile(aes(fill=z)) + 
    scale_fill_gradientn(limits = c(-3,3), 
    colours=c("navyblue", "darkmagenta", "darkorange1"), 
    breaks=b, labels=format(b)) 

a teraz jeśli chcesz przerwy, które pojawiają się w legendzie rozszerzyć dalej, można zmienić ich ustawienie, gdzie pojawiają się znaki kleszcza.

Dobrą analogią do zapamiętania są zawsze zwykłe osie x i y. Ustawienie "breaks" zmieni się tam, gdzie pojawiają się znaczniki. Jeśli chcesz zmienić zakres zakresu osi x lub y, zazwyczaj zmieniasz ustawienie, takie jak ich "ograniczenia".

+0

Myślę, że próbuję osiągnąć coś podobnego, ale nie udaje się z tym rozwiązaniem. Mam wiele zestawów danych, w których wartości są w ograniczonych zakresach, ale teoretycznie mogą wynosić od 0 do -100 (dB). wykonanie scale_fill_gradient (low = "white", high = "red") jest w porządku, ale nie pozwala mi wizualnie porównać zestawów danych. scale_fill_gradient (low = "biały", wysoki = "czerwony", ograniczenia = c (0, -100), przewodnik = "legenda", ograniczenia = c (0, -100), przerwy = b, etykiety = format (c (0, -100)) nie tworzy legendy. – MartinT