Nieliniowy rozkład kolorów w zakresie wartości w geom_raster

Mam do czynienia z następującym problemem: kilka skrajnych wartości dominuje w skali kolorów mojejgeom_raster wątek. Przykład jest prawdopodobnie bardziej jasny (zauważ, że ten przykład działa tylko z najnowszą wersją ggplot2, używam 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()

W tej chwili rozwiązuję to, ustawiając wartości nad pewnym kwantylem równym temu kwantylowi:

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

To naprawdę nie wydaje się optymalnym rozwiązaniem. Chciałbym zrobić nieliniowe odwzorowanie kolorów na zakres wartości, tj. Więcej kolorów obecnych w obszarze z większą liczbą obserwacji. Wspplot mógłbym użyćclassIntervals zclassInt pakiet do obliczenia odpowiednich granic klas:

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)

O ile mi wiadomo, nie jest możliwe zakodowanie tego odwzorowania kolorów na interwały klas, jak to możliwespplot. Mogę przekształcićfill osi, ale ponieważ są wartości ujemnefill zmienna, która nie będzie działać.

Więc moje pytanie brzmi: czy są jakieś rozwiązania tego problemu przy użyciu ggplot2?

questionAnswers(1)

yourAnswerToTheQuestion