2016-04-12 10 views
1

Ich möchte ein Raster so plotten, dass Werte außerhalb der Skalengrenzen die gleichen Farben der Skalengrenzen selbst haben.Ausgrenzen als Grenzen in ggplot

# Generate data 
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 
} 
pp200 <- pp(200) 
ggplot(pp200, aes(x, y, fill = z)) + 
geom_raster() + 
scale_fill_gradient2(limits=c(-0.5, 0.5)) 

Ergebnis: example image

Alle außerhalb der Grenzen Werte sind grey50 (na.value)!

Ich habe auch mit den scale_fill_gradient2() Optionen ausprobiert:

oob=squish #This does not seem to exists anymore 

und

oob=function(x, ...) x #does nothing 

und

oob=clip #this does not work: 
#Error in f(...) : argument "x2" is missing, with no default 

Wie kann ich die aus gebundenen Werte können Farbe, die zur Zeit abgebildet werden an NA, mit den Grenzwerten der Skala? Im obigen Beispiel sollten die Werte > 0.5 blau sein, < -0.5 sollte rot sein. Ich weiß, dass ich das tun kann, indem ich den Datensatz unter Verwendung von Faktoren abschneide, aber ich möchte eine kontinuierliche Farbskala. Ich kann auch Pausen verwenden, um die angezeigten Grenzen zu setzen, aber ich möchte, dass die Vollfarbenskala unabhängig vom Plotinhalt angezeigt wird. Ich möchte auch jede Änderung der Daten wenn möglich vermeiden.

+0

@Axeman Sie meinen als OOF-Funktion oder als Modifikation der Daten? Ja, natürlich kann ich die Daten ändern, aber das möchte ich vermeiden. Der Grund ist, dass zum Beispiel, wenn ich eine 'stat_summary()' verwenden möchte, es geschraubt wird. Ja, ich kann das umgehen, aber für etwas, das einfach sein sollte (und das in früheren ggplot-Versionen mit 'oob = squish' funktionierte) scheint es ein bisschen zu hackig zu sein (was übrigens nicht funktioniert' oob = function (z) ifelse (z <0,5, ifelse (z> -0,5, z, -0,5), 0,5) ') – AF7

Antwort

1

Der Grund oob = squish scheint nicht mehr zu funktionieren ist, dass ein Teil der Funktionalität von ggplot2 in das scales Paket übertragen wurde. Laden Sie zuerst scales, oder geben Sie stattdessen oob = scales::squish ein.