2016-11-03 3 views
1

Ich arbeite mit einigen Gitterdaten und habe Probleme mit diskreten divergierenden Skalen zu arbeiten. Insbesondere, wie Sie den Mittelpunkt so einstellen, dass er nicht in der Mitte des Bereichs liegt. Dies ist ein reproduzierbares Beispiel zu bekommen, was ich meine:Mittelpunkt diskreter divergierender Skala in ggplot2

library(ggplot2) 
grid <- expand.grid(lon = seq(0, 360, by = 2), lat = seq(-90, 0, by = 2)) 
grid$z <- with(grid, cos(lat*pi/180) - .7) 

ggplot(grid, aes(lon, lat)) + 
    geom_raster(aes(fill = cut_width(z, .1))) + 
    scale_fill_brewer(palette = "RdBu") 

Hier ist die Mitte der Skala ist nicht die Kluft zwischen positiven und negativen Werten. Ich weiß, dass ich eine kontinuierliche Skala verwenden könnte, aber ich finde, dass weniger Farben helfen, was ich zu zeigen versuche.

Gibt es eine Möglichkeit, den Mittelpunkt in einer diskreten Skala zu verschieben? Andere Alternativen, die das gleiche Ergebnis erzielen, sind ebenfalls willkommen.

Antwort

5

Das Problem ist, dass Ihre Schnittpunkte nicht symmetrisch um 0 fallen und sich direkt auf Ihre Farben beziehen. Ein Ansatz ist die manuelle Ihre Schnittpunkte so eingestellt, dass sie drehen sich um 0. Dann, nur um sicher zu machen, um nicht ungenutzt Ebenen in der Legende zu löschen:

zCuts <- 
    seq(-.7, 0.7, length.out = 10) 

ggplot(grid, aes(lon, lat)) + 
    geom_raster(aes(fill = cut(z, zCuts))) + 
    scale_fill_brewer(palette = "RdBu" 
        , drop = FALSE) 

enter image description here

Wenn Sie bereit sind, mit einem gehen stattdessen Gradienten solcher diskreten Farben, können Sie scale_fill_gradient2 die standardmäßig Zentren bei 0 und liegt zwischen zwei Farben verwenden:

ggplot(grid, aes(lon, lat)) + 
    geom_raster(aes(fill = z)) + 
    scale_fill_gradient2() 

enter image description here

Oder, wenn Sie wirklich die Interpolation von Color Brewer wollen, können Sie das limits Argument in scale_fill_distiller setzen und stattdessen einen Gradienten bekommen. Hier setze ich sie auf + und - der Bereich um 0 (max(abs(grid$z)) erhält die größte Abweichung von 0, ob es die min oder die max ist, um sicherzustellen, dass der Bereich symmetrisch ist). Wenn Sie mehr als die 11 verfügbaren Werte verwenden, ist, dass wahrscheinlich der beste Weg zu gehen:

ggplot(grid, aes(lon, lat)) + 
    geom_raster(aes(fill = z)) + 
    scale_fill_distiller(palette = "RdBu" 
         , limits = c(-1,1)*max(abs(grid$z)) 
         ) 

enter image description here

Wenn Sie mehr Farben wünschen, ohne einen Gradienten zu tun, sind Sie wahrscheinlich zu müssen gehen konstruiere deine eigene Palette manuell mit mehr Farben. Je mehr Sie hinzufügen, desto weniger unterscheiden Sie zwischen den Farben. Hier sehen Sie ein Beispiel, bei dem zwei Paletten zusammengeführt werden, um sicherzustellen, dass Sie mit unterschiedlichen Farben arbeiten.

zCuts <- 
    seq(-.7, 0.7, length.out = 20) 

myPallette <- 
    c(rev(brewer.pal(9, "YlOrRd")) 
    , "white" 
    , brewer.pal(9, "Blues")) 


ggplot(grid, aes(lon, lat)) + 
    geom_raster(aes(fill = cut(z, zCuts))) + 
    scale_fill_manual(values = myPallette 
        , drop = FALSE) 

enter image description here

+0

Ich dachte ich, so etwas zu tun hatte. Vielen Dank. Jetzt versuche ich eine erweiterte Palette zu verwenden (da ich in meinem realen Plot mehr brauche als die 11 vom Brauer angebotenen Farben) und das Problem ist, dass es keine Legende zeigt 'ggplot (grid, aes (lon, lat)) + geom_raster (aes (fill = Schnitt (z, Schnitte))) + scale_fill_manual (Palette = div_pal, name = "Z", scale_name = "z", Tropfen = F) ' –

+0

Gewöhnlich 'scale _ * _ manual' nimmt ein Argument' values' anstelle von 'palette'. Was ist 'div_pal'? Ist es eine Funktion oder ein Vektor von Farben? –

+0

Es ist eine Funktion, die mit colorRampPalette gemacht wurde, um die RdBu-Skala von Farbbrüher zu erweitern: 'div_pal <- colorRampPalette (Brauer.Kumpel (Name = "RdBu", n = 11)) ' –

Verwandte Themen