2017-02-24 11 views
5

Próbuję wyświetlić wiele warstw w ggplot2, ale chciałbym użyć różnych schematów kolorów scale_fill_ dla każdej warstwy. Nie mogę tego zrobić, ponieważ dwukrotne wywołanie funkcji scale_fill_gradientn powoduje tylko nadpisanie pierwszego połączenia drugim.Używanie więcej niż jednego `scale_fill_` w` ggplot2`

library(ggplot2) 
library(reshape2) 
library(RColorBrewer) 
set.seed(123) 

będę pierwszy wykreślić tile siatkę (uwaga ja ustawiania kolorów z scale_fill_gradientn):

foo <- matrix(data = rnorm(100), ncol = 10) 
foo <- melt(foo) 

plot <- ggplot() + 
    geom_tile(data = foo, 
      mapping = aes(x = Var1, y = Var2, fill = value)) + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "BrBG")) 
) 
plot 

enter image description here

Teraz chciałbym umieścić kolejną działkę na szczycie tego, ale z unikalną kolorystyką. Mogę stworzyć inną działkę dobrze:

bar <- data.frame(x = rnorm(100, 4, 1), 
        y = rnorm(100, 6, 1.5)) 

ggplot() + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level..), 
        geom = "polygon") + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 

enter image description here

Co chciałbym zrobić, to działka druga działka na górze pierwszej, ale utrzymać kolorystyce widać powyżej. Jeśli spróbuję po prostu dodać drugą warstwę na wierzchu, nadpisuję oryginał scale_fill_gradientn i wymuszam dwie warstwy, aby współdzieliły jeden schemat kolorów (który w tym przypadku również "kompresuje" drugą warstwę, aby spadł całkowicie w jednym kolorze:

plot <- plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level..), 
        geom = "polygon") + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 
plot 

enter image description here

Czy istnieje sposób, aby określić własne schematy kolorów dla każdej warstwie? Zauważyłem, że, na przykład, stat_density_2d rozumie colour estetyczne, ale Próbowałem określając jedną bezskutecznie (IT tylko dodaje kolor jako etykietę w legendzie i przywraca domyślny schemat kolorów):

ggplot() + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level.., colour = "red"), 
        geom = "polygon") + 
    xlim(0, 10) + ylim(0, 10) 

enter image description here

Czuję, musi istnieć inny sposób ustawić schemat kolorów na zasadzie „na warstwę” zasadach, ale ja wyraźnie patrząc w niewłaściwych miejscach.

+2

Możesz mieć tylko jedną skalę wypełnienia na wykres. – Roland

+0

Dzięki Roland, rozumiem to, i to jest ta przeszkoda, z którą się podniecam.Chyba szukam alternatywnej metody ustawienia schematu kolorów, tak, że mogę obejść to ograniczenie? – rosscova

+1

Możesz połączyć obie skale w jedną skalę, jeśli jesteś zadowolony z jednej legendy. Jeśli chcesz dwóch skal, musisz użyć 'ggplotGrob', a następnie zhakować na poziomie' grid', tj. Wyodrębnić groby, które potrzebujesz z drugiego wykresu i dodać je do pierwszego wykresu. Uważam jednak, że fabuła z dwoma legendami wypełnienia jest złym spiskiem. – Roland

Odpowiedz

5

Jednym ze sposobów obejścia tego ograniczenia jest odwzorowanie na kolor (jak już wspomniano). W ten sposób:

Trzymamy bazowego rastrowych działkę, a następnie dodać:

plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, col = ..level..), 
        geom = "path", size = 2) + 
    scale_color_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 

To daje nam:

enter image description here

To nie jest do końca satysfakcjonujące, głównie dlatego, że skala mieć spora część percepcyjnego nakładania się (chyba). Zabawy z różnych skalach na pewno może daje nam lepszy wynik:

plot <- ggplot() + 
    geom_tile(data = foo, 
      mapping = aes(x = Var1, y = Var2, fill = value)) + 
    viridis::scale_fill_viridis(option = 'A', end = 0.9) 

plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, col = ..level..), 
        geom = "path", size = 2) + 
    viridis::scale_color_viridis(option = 'D', begin = 0.3) + 
    xlim(0, 10) + ylim(0, 10) 

enter image description here

Nadal nie wielki moim zdaniem (z wykorzystaniem wielu skal kolorów jest mylące dla mnie), ale o wiele bardziej znośny.

+0

Dzięki @Axeman, to z pewnością daje obejście, co jest fantastyczne. Wydaje się, że ogranicza on wykres "gęstości" do linii, zamiast wypełniać, czy tak? – rosscova

+1

Prawidłowo. Nie możesz mieć dwóch skal dla "wypełnienia". – Axeman