2012-04-18 4 views
10

Ich arbeite gerade an einem Projekt, bei dem Plots erstellt werden, die den Beispielen in Hadleys ggplot2 0.9.0 Seite bezüglich stat_density2d() sehr ähnlich sind.ggplot2: Setze alpha = 0 für bestimmte Punkte, abhängig vom Füllwert

library(ggplot2) 
dsmall <- diamonds[sample(nrow(diamonds), 1000), ] 
d <- ggplot(dsmall, aes(carat, price)) + xlim(1,3) 
d + stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) 
last_plot() + scale_fill_gradient(limits=c(1e-5,8e-4)) 

enter image description here

Nun, was mit Ich kämpfe ist ein Weg, Alpha im Wesentlichen auszuschalten (alpha = 0) für alle Fliesen nicht in dem Fill-Bereich. Also jedes graue Bild im Bild, das Alpha sollte auf 0 gesetzt werden. Das würde das Bild viel schöner machen, vor allem wenn es zum Beispiel über einer Karte liegt.

Wenn jemand irgendwelche Vorschläge hat, würde dies sehr geschätzt werden.

+3

Der graue Bereich, der durch das Argument na.value gesteuert wird, um scale_fill_gradient, aber selbst wenn ich eine transparente Farbe angeben (wie na.value = rgb (1,1,1,0)) es erscheint undurchsichtig, also muss etwas anderes passieren. – Fojtasek

+0

Okay, also vielleicht, wenn wir die Grenzen eines scale_alpha_continuous auf den Füllwert (dichte) setzen können, dann setze das alpha na.value = 0 ... –

+0

bisher kein Glück, obwohl die Einstellung auf 'gray90' steht es sieht aus * fast * OK, da das die Farbe des Hintergrundrasters ist ... Ich vermute tatsächlich, dass es sich um ein ggplot "Problem" (Buglet/Wunschliste?) handelt ... möglicherweise verwandt mit https://github.com/hadley/ggplot2/Ausgaben/475? –

Antwort

9

Dies scheint zu funktionieren:

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., 
    alpha=cut(..density..,breaks=c(0,1e-5,Inf))), 
    contour = FALSE)+ 
scale_alpha_manual(values=c(0,1),guide="none") 

enter image description here

+0

Perfekt! Danke für deine Hilfe, Ben. –

+0

Das ist großartig, hat mir sehr geholfen. Ich würde es 3 upvotes geben, wenn ich könnte. – cengel

11

Eine weitere Möglichkeit, nur mit ifelse statt cut.

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., alpha = ifelse(..density.. < 1e-5, 0, 1)), 
    contour = FALSE) + 
scale_alpha_continuous(range = c(0, 1), guide = "none") 

enter image description here

+0

Das funktioniert auch super. Könntest du erklären, warum es nicht ausreicht, "Alpha" nur in den "aes (..)" - Optionen zu setzen, sondern warum die Transparenz des Füllbereichs nur kontrolliert werden kann, indem der Bereich mit "scale_alpha_continuous" eingestellt wird? Zum Beispiel habe ich 'alpha = ifelse (.. dichte .. <1e-5, 0, 0.7)' und 'scale_alpha_continuous (range = c (0, 0.7))' 'verwendet, um den Füllbereich leicht transparent zu machen. – cengel

Verwandte Themen