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?