Transforme la escala de colores en una distribución de colores transformada por probabilidad con scale_fill_gradientn ()

Estoy tratando de visualizar datos ráster con muchas colas, y me gustaría una asignación no lineal de colores al rango de valores. Hay un par de preguntas similares, pero en realidad no resuelven mi problema específico (ver enlaces a continuación).

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)

Así es como se ven los datos si no se transforman de alguna manera:

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

Mi pregunta es una especie de pregunta de seguimiento relacionada conéste oéste y la solución dadaaquí en realidad produce exactamente la trama que quiero, excepto por la leyenda:

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)

Ahora quiero que la escala de color en la leyenda represente la distribución no lineal de los valores (ahora solo se ve la parte roja de la escala), es decir, la leyenda también debería basarse en cuantiles. ¿Hay alguna manera de lograr esto?

Pensé que eltrans argumento dentro de la escala de colores podría hacer el truco, como se sugiereaquí , pero eso arroja un error, creo que porqueqnorm(pnorm(dat$z)) da como resultado algunos valores infinitos (aunque no entiendo completamente la función ...).

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

Entonces, ¿alguien sabe cómo tener una distribución de color basada en cuantiles en la tramay en la leyenda?

Respuestas a la pregunta(1)

Su respuesta a la pregunta