使用scale_fill_gradientn()将颜色比例转换为概率转换的颜色分布

使用scale_fill_gradientn()将颜色比例转换为概率转换的颜色分布,r,ggplot2,R,Ggplot2,我正在尝试可视化重尾光栅数据,我希望颜色与值范围的非线性映射。有几个类似的问题,但它们并不能真正解决我的具体问题(见下面的链接) 我的问题是关于 或者,给出的解决方案实际上得到了我想要的图,除了图例: 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,

我正在尝试可视化重尾光栅数据,我希望颜色与值范围的非线性映射。有几个类似的问题,但它们并不能真正解决我的具体问题(见下面的链接)

我的问题是关于 或者,给出的解决方案实际上得到了我想要的图,除了图例:

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)

那么,有人知道如何在情节和图例中使用基于分位数的颜色分布吗

此代码将使用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))
  )

为什么不直接使用
trans=“log”
?正态变换在对数正态数据上没有多大意义。彩虹配色方案真是个糟糕的主意#endrainbow对于这个玩具数据集,
trans=“log”
就可以了,只是对于我的特定数据,我想要一个分位数分布。对于彩虹比例(感谢您指向#endrainbow),我需要与特定约定保持一致……问题似乎在于label::extended,可能是因为pnorm不适合数据。用plnorm切换pnorm使图形工作。或者,手动设置中断。是的,plnorm将给出合理的结果;但是如果我真的想要分位数变换,我该怎么办呢?至于手动设置分界(假设你的意思是这样的
scale\u fill\u gradientn(colors=fill.colors,values=qn,breaks=c(0.01,1,10))
):这不会转换图例中的颜色比例,只会在指定的值处标记。我不知道如何让分位数转换工作,因为你也需要反向转换。我打算在pnorm转换中使用手动中断,因为自动中断不起作用。这会引发一个错误-您是如何定义
norm\u trans
?对不起,我的错误-norm\u trans定义太多,因此不再有错误。色阶现在看起来确实不错;我只是希望绘图中的颜色与上面的第二个示例完全相同,因为两者都基于分位数,但它们不是。(在您的示例中,更多内容被转换为红色)。但也许我只是不完全理解pnorm和qnorm,所以我想你的是这个问题的最佳解决方案。谢谢!
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)
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
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))
  )