Нелинейное распределение цветов по диапазону значений в geom_raster
Я столкнулся со следующей проблемой: несколько экстремальных значений доминируют над цветами в моем графике geom_raster
. Пример, вероятно, более ясен (обратите внимание, что этот пример работает только с последней версией ggplot2, я использую 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()
![enter image description here]()
Сейчас я решаю это, устанавливая значения над определенным квантилем, равным этому квантилю:
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)})
![enter image description here]()
Это не похоже на оптимальное решение. То, что я хотел бы сделать, это иметь нелинейное отображение цветов в диапазон значений, т.е. Больше цветов, присутствующих в области, с большим количеством наблюдений. В spplot
я мог бы использовать classIntervals
из пакета classInt
для вычисления соответствующих границ класса:
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)
![enter image description here]()
Насколько мне известно, невозможно скопировать это сопоставление цветов в интервалы классов, как я могу, в spplot
. Я мог бы преобразовать ось fill
, но поскольку в переменной fill
есть отрицательные значения, которые не будут работать.
Итак, мой вопрос: есть ли какие-либо решения этой проблемы, используя ggplot2?
Ответы
Ответ 1
Кажется, что ggplot (0.9.2.1) и шкалы (0.2.2) принесут все, что вам нужно (для вашего оригинала m
):
library(scales)
qn = quantile(m$fill, c(0.01, 0.99), na.rm = TRUE)
qn01 <- rescale(c(qn, range(m$fill)))
ggplot(m, aes(x = x, y = y, fill = fill)) +
geom_raster() +
scale_fill_gradientn (
colours = colorRampPalette(c("darkblue", "white", "darkred"))(20),
values = c(0, seq(qn01[1], qn01[2], length.out = 18), 1)) +
theme(legend.key.height = unit (4.5, "lines"))
![resulting plot]()