Нелинейное распределение цвета по диапазону значений в 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()

Прямо сейчас я решаю это, устанавливая значения для определенного квантиля, равного этому квантилю:

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

Это не совсем похоже на оптимальное решение. То, что я хотел бы сделать, - это иметь нелинейное отображение цветов в диапазон значений, то есть больше цветов присутствует в области с большим количеством наблюдений. В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)

Насколько мне известно, невозможно жестко закодировать это отображение цветов в интервалы классов, как я могу вspplot, Я мог бы преобразоватьfill ось, но так как есть отрицательные значения вfill переменная, которая не будет работать.

Итак, мой вопрос: есть ли решения этой проблемы с использованием ggplot2?

 baptiste16 дек. 2013 г., 23:58
Я только что узнал об этом вопросе, поэтому я добавлю ссылку на связанный запрос, который я сделал недавно:stackoverflow.com/questions/18036849/...

Ответы на вопрос(1)

Решение Вопроса

что ggplot (0.9.2.1) и scale (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"))

 Spacedman11 окт. 2012 г., 18:14
Болезненные! Я хотел бы видеть функцию градиента масштаба _ * _, которая просто принимает значения и цвета и интерполируется.
 smci18 июл. 2013 г., 10:32
+1 Это прекрасно.scales имеет массу полезных методов, напримерscales::gradient_n_pal(...) и преобразования, напримерlog1p_trans, squish_infinite
 cbeleites11 окт. 2012 г., 13:34
@CarlWitthoft: Раньше я делал это, но потом мне пришлось искать помощь дляscale_fill_gradientn (потому что я пытался поместить цвета вvalues) ...
 cbeleites11 окт. 2012 г., 19:56
@Spacedman: скажи Хэдли. Вы можете сказать ему +1 от меня для весов сtrim_quantiles параметры ... ;-)
 Carl Witthoft11 окт. 2012 г., 13:23
Я собирался указать, что вы можете создать свою собственную цветовую палитру с любым масштабированием, которое вы хотите, но это выглядит гораздо проще.

Ваш ответ на вопрос