Nichtlineare Farbverteilung über den Wertebereich in einem geom_raster

Ich stehe vor folgendem Problem: Einige extreme Werte dominieren die Farbskala meinergeom_raster Handlung. Ein Beispiel ist wahrscheinlich klarer (beachten Sie, dass dieses Beispiel nur mit einer aktuellen ggplot2-Version funktioniert, ich verwende 0.9.2.1):

library(ggplot2)
library(reshape)
theme_set(theme_bw())

m_small_sd = melt(matrix(rnorm(10000), 100, 100))
m_big_sd = melt(matrix(rnorm(100, sd = 10), 10, 10))
new_xy = m_small_sd[sample(nrow(m_small_sd), nrow(m_big_sd)), c("X1","X2")]
m_big_sd[c("X1","X2")] = new_xy
m = data.frame(rbind(m_small_sd, m_big_sd))
names(m) = c("x", "y", "fill")

ggplot(m, aes_auto(m)) + geom_raster() + scale_fill_gradient2()

Im Moment löse ich das, indem ich die Werte über einem bestimmten Quantil gleich diesem Quantil setze:

qn = quantile(m$fill, c(0.01, 0.99), na.rm = TRUE)
m = within(m, { fill = ifelse(fill < qn[1], qn[1], fill)
                fill = ifelse(fill > qn[2], qn[2], fill)})

Dies fühlt sich nicht wirklich als optimale Lösung an. Was ich tun möchte, ist eine nichtlineare Abbildung von Farben auf den Wertebereich, d. H. Mehr Farben, die in dem Bereich mit mehr Beobachtungen vorhanden sind. Imspplot ich könnte benutzenclassIntervals von demclassInt Paket, um die entsprechenden Klassengrenzen zu berechnen:

library(sp)
library(classInt)
gridded(m) = ~x+y
col = c("#EDF8B1", "#C7E9B4", "#7FCDBB", "#41B6C4", 
        "#1D91C0", "#225EA8", "#0C2C84", "#5A005A")
at = classIntervals(m$fill, n = length(col) + 1)$brks
spplot(m, at = at, col.regions = col)

Meines Wissens ist es nicht möglich, diese Zuordnung von Farben zu Klassenintervallen so fest zu codieren, wie ich es kannspplot. Ich könnte das verwandelnfill Achse, aber da gibt es negative Werte in derfill Variable, die nicht funktionieren wird.

Meine Frage lautet also: Gibt es Lösungen für dieses Problem mit ggplot2?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage