Distribución de color no lineal en el rango de valores en un geom_raster

Me enfrento al siguiente problema: algunos valores extremos dominan la escala de colores de migeom_raster trama. Un ejemplo es probablemente más claro (tenga en cuenta que este ejemplo solo funciona con una versión reciente de ggplot2, yo uso 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()

En este momento, resuelvo esto estableciendo los valores sobre un determinado cuantil igual a ese cuantil:

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)})

Esto realmente no se siente como una solución óptima. Lo que me gustaría hacer es tener un mapeo no lineal de colores al rango de valores, es decir, más colores presentes en el área con más observaciones. Enspplot Podría usarclassIntervals desde elclassInt paquete para calcular los límites de clase apropiados:

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)

Que yo sepa, no es posible codificar este mapeo de colores a intervalos de clase como puedo hacerlo enspplot. Podría transformar elfill eje, pero como hay valores negativos en lafill Variable que no funcionará.

Entonces mi pregunta es: ¿hay alguna solución a este problema usando ggplot2?

Respuestas a la pregunta(1)

Su respuesta a la pregunta