2012-07-31 9 views
5

würde ich gerne eine gespiegelte 95% Dichtekurve zeichnen und Anfahrtsplan alpha zur Dichte:ggplot2: set (nichtlineare) Werte für alpha

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 

Dies funktioniert gut, aber ich möchte das machen Kontrast zwischen den Kanten und der Mitte deutlicher, dh ich möchte, dass die Kanten fast weiß sind und nur der mittlere Teil schwarz ist. Ich habe manipuliert mit scale_alpha() aber ohne Glück. Irgendwelche Ideen?

Bearbeiten: Letztendlich möchte ich mehrere Regentropfen plotten, d. H. Die einzelnen Tropfen werden klein sein, aber die Schattierung sollte immer noch deutlich sichtbar sein.

+0

+1 für Beispielcode! –

Antwort

0

Während grübeln sowohl Ihre Antworten, die ich eigentlich genau das gefunden, was ich suchte. Der einfachste Weg ist, einfach scale_colour_gradientn mit einem Vektor von Grautönen zu verwenden.

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

Statt Mapping dens0 zum alpha, würde ich es auf color Karte:

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

Jetzt haben wir noch den Kontrast in der Farbe ist hauptsächlich in den Schwänzen. Unter Verwendung von zwei Farben hilft, einen Bit (beachten Sie, dass der Schalter in der Farbe bei 0,25 ist):

drf + scale_color_gradient2(midpoint = 0.25) 

enter image description here

Schließlich umfassen die Verteilung der dens0 Werte, Base I der Mittelpunkt der Farbskala auf der Medianwert in den Daten:

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

enter image description here

Hinweis!: Aber so wie Sie Ihre Daten optimieren, liegt der größte Unterschied in Ihren Daten in den extremeren Werten in Ihrem Dataset. Der Versuch, dies zu verdecken, indem man mit einer nichtlinearen Skala herumhantiert, oder indem ich eine Farbskala wie ich twee, könnte ein falsches Bild der realen Daten ergeben.

+0

danke Paul. Ich habe all diese schon einmal probiert, bin aber mit dem Ergebnis nicht zufrieden und finde es wichtig, dass es schwarz auf weiß dargestellt werden kann. Ich habe das Gefühl, dass Alpha in meinem Beispiel nur von Grau bis Schwarz reicht. Ich dachte darüber nach, irgendwie den Alphabereich über den gesamten Bereich von Weiß bis Schwarz zu vergrößern. –

3

Hier ist eine Lösung mit geom_ribbon() anstelle von geom_line()

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

Siehe Paul Antwort für die Farben zu ändern.

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.Sobald ich mehrere Plots erzeuge, erscheinen die Konturen gezackt und die Gesamtergebnisse erscheinen schwarz: 'n <- 10 dataset5 <- do.call (" rbind ", replizieren (n, Dataset, vereinfachen = FALSE)) dataset5 $ Studie <- rep (c (1:10), jeweils = 998) ggplot (Datensatz5, aes (x = x, ymin = -dens0, ymax = dens0, Gruppe = Gruppe, alpha = dens0)) + geom_ribbon() + scale_alpha (Bereich = c (0, 1)) + facet_grid (Studie ~.) ' –

+0

Können Sie bitte ein Beispiel für die gezackten Konturen geben? Ich verstehe sie nicht mit deinem Code. Wenn das Bild zu schwarz ist, dann spiele ein wenig mit dem Range-Argument von scale_alpha. 0 = vollständig transparent, 1 = vollständig undurchsichtig. Oder Sie können ein Argument 'color = "gray"' oder 'color = "red"' zu geom_ribbon hinzufügen. – Thierry

+0

Die gezackten Konturen wurden aufgrund der Tatsache, dass ich den Graphen auf ein Pixelformat gedruckt habe. Es scheint jedoch, dass man das umgehen kann, indem man sowohl 'geom_ribbon' als auch' geom_line' verwendet. –