使用ggplot2转换颜色比例尺,但保持漂亮的图例

16

我看到过一些类似的问题,但我想尽可能直接地提出我的问题:

我有一个散点图,其中将“z”变量编码为颜色刻度:

library(ggplot2)
myData <- data.frame(x = rnorm(1000),
                     y = rnorm(1000))
myData$z <- with(myData, x * y)

badVersion <- ggplot(myData,
              aes(x = x, y = y, colour = z))
badVersion <- badVersion + geom_point()
print(badVersion)
这会产生这样的效果:bad version 可以看到,由于“z”变量服从正态分布,很少有点被着色为分布的“极端”颜色。这是应该的,但我希望强调差异。一种方法是使用:
betterVersion <- ggplot(myData,
                        aes(x = x, y = y, colour = rank(z)))
betterVersion <- betterVersion + geom_point()
print(betterVersion)

这将产生以下结果:better version

通过将rank()应用于“z”变量,我可以更加强调“z”变量内的小差异。在这里,可以想象使用任何转换,而不是rank,但你明白我的意思。

我的问题本质上是:最直接的方法或最“真正的ggplot2”方式是什么,在保持着彩色点的转换版本的同时,以原始单位(z的单位)获得图例?

我有一种感觉这里会用到rescaler(),但我不清楚如何使用rescaler()进行任意转换等。总的来说,更清晰的示例将很有用。

非常感谢您的时间。


3
+1 分,如果提供可重现的例子、明确的目标和一个有趣的可视化问题。请注意,这是一份翻译任务,我只会翻译文本内容,不会进行解释。 - Roman Luštrik
1个回答

10
请看一下包scales,特别是?trans
我认为,根据得到的值或更极端的概率映射颜色的转换应该是合理的(基本上是pnorm(z))。
我认为scale_colour_continuous(trans = probability_trans(distribution = 'norm')应该可以工作,但会引发警告。
所以我定义了一个新的转换(参见?trans_new)。
我必须定义一个转换和一个反转换。
library(scales)
norm_trans <- function(){
  trans_new('norm', function(x) pnorm(x), function(x) qnorm(x))
}

badVersion + geom_point() + scale_colour_continuous(trans = 'norm'))

enter image description here

使用提供的probability_trans会引发警告,并且似乎无法正常工作。
# this throws a warning
badVersion + geom_point+
  scale_colour_continuous(trans = probability_trans(distribution = 'norm'))

## Warning message:
## In qfun(x, ...) : NaNs produced

enter image description here


这是一个非常有用的答案,谢谢。scales包中的trans_new()文档缺少示例,所以感谢您提供了一个。此外,pnorm()绝对是我要使用的正确函数。 - isDotR
但现在我有一个新问题:一时兴起,我尝试了badVersion + geom_point() + scale_x_continuous(trans = 'norm'),但它没有起作用。使用badVersion + geom_point() + scale_x_continuous(trans = 'log')确实会产生结果。有什么想法吗? - isDotR
嗯...那很有趣--我会仔细考虑一下...也许轴比例尺被处理得不同,但这很奇怪。更可能的是我误解了转换的工作原理。 - mnel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接