Преобразуйте цветовую шкалу в преобразованное по вероятности распределение цвета с помощью scale_fill_gradientn ()

Я пытаюсь визуализировать сильно замкнутые растровые данные, и я хотел бы, чтобы нелинейное отображение цветов соответствовало диапазону значений. Есть пара похожих вопросов, но они не решают мою конкретную проблему (см. Ссылки ниже).

library(ggplot2)
library(scales)

set.seed(42)
dat <- data.frame(
   x = floor(runif(10000, min=1, max=100)),
   y = floor(runif(10000, min=2, max=1000)),
   z = rlnorm(10000, 1, 1) )

# colors for the colour scale:   
col.pal <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000"))
fill.colors <- col.pal(64)

Вот как выглядят данные, если не преобразованы каким-либо образом:

ggplot(dat, aes(x = x, y = y, fill = z)) +
   geom_tile(width=2, height=30) +
   scale_fill_gradientn(colours=fill.colors) 

Мой вопрос является своего рода последующим вопросом, связанным сэтот или жеэтот и решение даноВот на самом деле дает именно тот сюжет, который я хочу, за исключением легенды:

qn <- rescale(quantile(dat$z, probs=seq(0, 1, length.out=length(fill.colors))))
ggplot(dat, aes(x = x, y = y, fill = z)) + 
   geom_tile(width=2, height=30) +
   scale_fill_gradientn(colours=fill.colors, values = qn)

Теперь я хочу, чтобы цветовая шкала в легенде представляла нелинейное распределение значений (теперь видна только красная часть шкалы), то есть легенда должна также основываться на квантилях. Есть ли способ сделать это?

Я думалtrans Аргумент в пределах цветовой шкалы может помочь, как и предполагалосьВот , но это выдает ошибку, я думаю, потому чтоqnorm(pnorm(dat$z)) приводит к некоторым бесконечным значениям (хотя я не совсем понимаю функцию ...).

norm_trans <- function(){
   trans_new('norm', function(x) pnorm(x), function(x) qnorm(x)) 
}
ggplot(dat, aes(x = x, y = y, fill = z)) + 
   geom_tile(width=2, height=30) +
   scale_fill_gradientn(colours=fill.colors, trans = 'norm')
> Error in seq.default(from = best$lmin, to = best$lmax, by = best$lstep) : 'from' must be of length 1

Итак, кто-нибудь знает, как получить квантильное распределение цвета на графикеа также в легенде?

 Richard Telford11 авг. 2016 г., 13:07
Я не понимаю, как заставить преобразование квантилей работать, потому что вам также нужно обратное преобразование. Я хотел использовать ручные разрывы с преобразованием pnorm, так как автоматические разрывы не работали
 silkita10 авг. 2016 г., 16:21
Для этого набора данных игрушек,trans="log" было бы хорошо, только для моих конкретных данных я хотел бы распределение квантили. И извините за масштаб радуги (и спасибо за указание на #endrainbow), я должен был соответствовать определенному соглашению ...
 Richard Telford10 авг. 2016 г., 15:44
почему бы просто не использоватьtrans = "log"? Нормальное преобразование не имеет большого смысла для логнормальных данных. И цветовые схемы радуги - действительно плохая идея. #endrainbow
 silkita11 авг. 2016 г., 13:14
Да, именно моя проблема. Как я могу использовать ручные перерывы с pnorm?
 Richard Telford10 авг. 2016 г., 17:49
Кажется, проблема связана с labeling :: extended, возможно, потому, что pnorm плохо подходит для данных. Переключение pnorm с помощью plnorm заставляет фигуру работать. Кроме того, установите разрывы вручную.
 silkita11 авг. 2016 г., 13:02
Да, PLNORM даст разумный результат; но что я могу сделать, если я действительно хочу квантильное преобразование? Что касается установки перерывов вручную (если вы имеете в виду что-то вроде этогоscale_fill_gradientn(colours=fill.colors, values=qn, breaks=c(0.01,1,10))): это не преобразует цветовую шкалу в легенде, а только метки с указанными значениями.

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

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

Этот код будет делать ручные разрывы с помощью преобразования pnorm. Это то, что вы после?

ggplot(dat, aes(x = x, y = y, fill = z)) + 
  geom_tile(width=2, height=30) +
  scale_fill_gradientn(colours=fill.colors, 
                       trans = 'norm', 
                       breaks = quantile(dat$z, probs = c(0, 0.25, 1))
  )
 silkita11 авг. 2016 г., 13:35
Это выдает ошибку - как вы определилиnorm_trans ?
 silkita11 авг. 2016 г., 14:20
Извините, я виноват - слишком много определений norm_trans, поэтому ошибок больше нет.
 Richard Telford11 авг. 2016 г., 13:53
Скопировал ваш код. Какая у вас ошибка?
 silkita11 авг. 2016 г., 14:24
Цветовая гамма определенно выглядит хорошо; Я просто ожидал, что цвета на графике будут выглядеть точно так же, как мой второй пример выше, потому что оба будут основаны на квантилях, но это не так. (Больше смещено на красный в вашем примере). Но, может быть, я просто не совсем понимаю pnorm и qnorm, поэтому я думаю, что ваше решение - лучшее решение проблемы. Большое спасибо!

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