Distribuição de cores não lineares sobre o intervalo de valores em um geom_raster

Estou diante do seguinte problema: alguns valores extremos estão dominando a escala de cores do meugeom_raster enredo. Um exemplo é provavelmente mais claro (note que este exemplo só funciona com uma versão ggplot2 recente, eu 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()

Agora, resolvo isso configurando os valores em um certo quantil igual a esse quantil:

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

Isso não parece realmente uma solução ótima. O que eu gostaria de fazer é ter um mapeamento não linear de cores para o intervalo de valores, ou seja, mais cores presentes na área com mais observações. Emspplot eu poderia usarclassIntervals declassInt pacote para calcular os limites de classe apropriados:

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)

De acordo com o meu conhecimento, não é possível codificar este mapeamento de cores para intervalos de classe como eu posso emspplot. Eu poderia transformar ofill eixo, mas como existem valores negativos nofill variável que não funcionará.

Então, minha pergunta é: existem soluções para esse problema usando o ggplot2?

questionAnswers(1)

yourAnswerToTheQuestion