Farbskala in wahrscheinlichkeitstransformierte Farbverteilung umwandeln mit scale_fill_gradientn ()

Ich versuche, stark schwänzende Rasterdaten zu visualisieren, und ich möchte eine nichtlineare Zuordnung von Farben zum Wertebereich. Es gibt einige ähnliche Fragen, die mein spezifisches Problem jedoch nicht wirklich lösen (siehe Links unten).

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)

So sehen die Daten aus, wenn sie nicht in irgendeiner Weise transformiert werden:

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

Meine Frage ist eine Art Folgefrage zudiese oderdiese, und die Lösung gegebenHie liefert eigentlich genau die Handlung, die ich will, mit Ausnahme der Legende:

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)

Nun möchte ich, dass die Farbskala in der Legende die nichtlineare Verteilung der Werte darstellt (jetzt ist nur der rote Teil der Skala sichtbar), d. H. Die Legende sollte auch auf Quantilen basieren. Gibt es eine Möglichkeit, dies zu erreichen?

Ich dachte dastrans Argument innerhalb der Farbskala könnte den Trick machen, wie vorgeschlagenHie, aber das wirft einen Fehler auf, ich denke, weilqnorm(pnorm(dat$z)) ergibt einige unendliche Werte (ich verstehe die Funktion aber nicht ganz ..).

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

Also, weiß jemand, wie man eine quantilbasierte Farbverteilung im Plot hat?un in der Legende?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage