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?