2012-07-31 6 views
5

chciałbym wykreślić lustrzanego 95% krzywej gęstości i map alfa gęstości:ggplot2: set (nieliniowe) wartości alfa

foo <- function(mw, sd, lower, upper) { 
x <- seq(lower, upper, length=500) 
dens <- dnorm(x, mean=mw, sd=sd, log=TRUE) 
dens0 <- dens -min(dens) 
return(data.frame(dens0, x)) 
} 

df.rain <- foo(0,1,-1,1) 

library(ggplot2) 


drf <- ggplot(df.rain, aes(x=x, y=dens0))+ 
geom_line(aes(alpha=..y..))+ 
geom_line(aes(x=x, y=-dens0, alpha=-..y..))+ 
stat_identity(geom="segment", aes(xend=x, yend=0, alpha=..y..))+ 
stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, alpha=-..y..)) 
drf 

Działa to dobrze, ale chciałbym, aby kontrast pomiędzy krawędziami i środkiem jest bardziej wyraźny, tzn. chcę, aby krawędzie były prawie białe, a tylko środkowa część była czarna. Interesowałem się scale_alpha(), ale bez powodzenia. Jakieś pomysły?

Edit: Docelowo chciałbym wykreślić kilka kropel deszczu, to znaczy poszczególne krople będą małe ale cieniowanie powinno być wyraźnie widoczne.

+0

+1 na przykład kod! –

Odpowiedz

0

Podczas gdy rozważała zarówno swoje odpowiedzi I rzeczywiście znaleźć dokładnie to, czego szukałem. Najprostszym sposobem jest po prostu użycie scale_colour_gradientn z wektorem szarości.

library(RColorBrewer) 
grey <- brewer.pal(9,"Greys") 

drf <- ggplot(df.rain, aes(x=x, y=dens0, col=dens0))+ 
stat_identity(geom="segment", aes(xend=x, yend=0))+ 
stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0))+ 
scale_colour_gradientn(colours=grey) 
drf 
4

Zamiast mapowania dens0 do alpha, to bym go color map:

drf <- ggplot(df.rain, aes(x=x, y=dens0))+ 
    geom_line(aes(color=..y..))+ 
    geom_line(aes(x=x, y=-dens0, color=-..y..))+ 
    stat_identity(geom="segment", aes(xend=x, yend=0, color=..y..))+ 
    stat_identity(geom="segment", aes(x=x, y=-dens0, xend=x, yend=0, color=-..y..)) 

enter image description here

Teraz mamy jeszcze kontrast w kolorze występuje głównie w ogonach. Korzystanie z dwóch kolorów pomaga trochę (zauważ, że wyłącznik w kolorze wynosi 0,25):

drf + scale_color_gradient2(midpoint = 0.25) 

enter image description here

Wreszcie, aby obejmować rozkład wartości dens0, opieram punkt środkowy skali kolorów na wartość mediany w danych:

drf + scale_color_gradient2(midpoint = median(df.rain$dens0)) 

enter image description here

Uwaga!: Jednak sposób, w jaki dostosowujesz dane, powoduje, że większość kontrastów w danych znajduje się w bardziej ekstremalnych wartościach w zbiorze danych. Próba zamaskowania tego przez manipulowanie w skali nieliniowej lub poprzez zmianę skali kolorów, tak jak ja, może przedstawiać fałszywy obraz rzeczywistych danych.

+0

dzięki Paul. Próbowałem już tych wszystkich wcześniej, ale nie jestem zadowolony z wyniku i uważam za ważne, aby można było wyświetlać je w czerni i bieli. Czuję, że na moim przykładzie alfa obejmuje tylko odcienie od szarego do czarnego. Myślałem o zwiększeniu zasięgu alfa w całym zakresie od białego do czarnego. –

3

Oto rozwiązanie przy użyciu geom_ribbon() zamiast geom_line() odpowiedź

df.rain$group <- seq_along(df.rain$x) 
tmp <- tail(df.rain, -1) 
tmp$group <- tmp$group - 1 
tmp$dens0 <- head(df.rain$dens0, -1) 
dataset <- rbind(head(df.rain, -1), tmp) 
ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 1)) 

enter image description here

ggplot(dataset, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    fill = dens0)) + geom_ribbon() + 
    scale_fill_gradient(low = "white", high = "black") 

enter image description here

Zobacz Pawła do zmiany kolorów.

dataset9 <- merge(dataset, data.frame(study = 1:9)) 
ggplot(dataset9, aes(x = x, ymin = -dens0, ymax = dens0, group = group, 
    alpha = dens0)) + geom_ribbon() + scale_alpha(range = c(0, 0.5)) + 
    facet_wrap(~study) 

enter image description here

+0

Mhm.Jak tylko wytworzę kilka wykresów, kontury będą wyglądały na postrzępione, a ogólne wyniki będą wyświetlane w kolorze czarnym: 'n <- 10 dataset5 <- do.call (" rbind ", replikacja (n, zbiór danych, uproszczenie = FALSE)) dataset5 $ badanie <- rep (c (1:10), każdy = 998) ggplot (zbiór danych5, aes (x = x, ymin = -dens0, ymax = dens0, grupa = grupa, alpha = dens0)) + geom_ribbon() + scale_alpha (range = c (0, 1)) + facet_grid (study ~.) ' –

+0

Czy możesz podać przykład postrzępionych konturów? Nie dostaję ich z twoim kodem. Jeśli obraz ma być czarny, to zagraj trochę z argumentem range of scale_alpha. 0 = całkowicie przezroczysty, 1 = całkowicie nieprzezroczysty. Lub możesz dodać argument "color =" gray "" lub "color =" red "" do geom_ribbon – Thierry

+0

Poszarpane kontury były spowodowane faktem, że wydrukowałem wykres w formacie pikselowym. Wydaje się jednak, że można to obejść, używając zarówno 'geom_ribbon' i' geom_line'. –