在ggplot2中是否有内置的对数色标?


76

这是装箱密度图的示例:

require(ggplot2)
n <- 1e5
df <- data.frame(x = rexp(n), y = rexp(n))
p <- ggplot(df, aes(x = x, y = y)) + stat_binhex()
print(p)

在此处输入图片说明

调整色阶以使中断以对数间隔很好,但是尝试一下

my_breaks <- round_any(exp(seq(log(10), log(5000), length = 5)), 10)
p + scale_fill_hue(breaks = as.factor(my_breaks), labels = as.character(my_breaks))

结果Error: Continuous variable () supplied to discrete scale_hue.似乎中断是期望因素(也许吗?),设计时考虑了分类变量?

我将发布一个不内置的解决方法作为答案,但是我认为我可能对使用迷失了方向scale_fill_hue,我想知道是否有明显的缺失。


1
您正在使用什么配色方案?真的很好看!自2011年以来,默认的ggplot颜色是否已更改?我只是得到蓝色阴影。
asachet

这是当时的默认设置。
格里戈尔·托马斯

Answers:


128

是! 我以前错过了的trans论点scale_fill_gradient。这样,我们可以获得具有适当图例和色标以及简洁的语法的解决方案。p从问题中使用和my_breaks = c(2, 10, 50, 250, 1250, 6000)

p + scale_fill_gradient(name = "count", trans = "log",
                        breaks = my_breaks, labels = my_breaks)

在此处输入图片说明

我的其他答案最好用于更复杂的数据功能。Hadley的评论鼓励我在底部的示例中找到此答案?scale_gradient


伙计,对于同一个问题,您有两个“最佳”答案:-)。太棒了!
爱德华多

3
@Eduardo ...问题也是我的。很高兴您发现它有用!
格里戈尔·托马斯

好了,log或者log10或者sqrt是bulit_in功能,现在我想通过将1000进行改造,所以我用trans_new的包装功能scales和写我自己的FUNC sci_trans <- function(){ trans_new('sci', function(x) x/1000, function(x) x*1000)} p + scale_fill_gradient(trans='sci'),但它不能正常工作,我该怎么办?谢谢
张玲

我注意到这适用于所有使用continuous_scale(例如scale_fill_continuous)的比例功能,而不仅仅是scale_fill_gradient
arvi1000 '19

20

另一种方式,在中使用自定义函数stat_summary_hex

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + 
  stat_summary_hex(function(z){log(sum(z))})

这是现在的一部分ggplot,但最初是由@kohske在此答案中提供了自定义的精美代码启发的stat_aggrhex。在ggplot> 2.0的版本中,使用上面的代码(或其他答案)

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) +
    stat_aggrhex(fun = function(z) log(sum(z))) +
    labs(fill = "Log counts")

要生成此图。

在此处输入图片说明


1
美学可能fill不是colour
joran 2011年

@Andrie,谢谢!与弄乱调色板以获得在对数刻度上均匀间隔的颜色相比,对我来说,这似乎更自然。
格雷戈尔·托马斯

6
对我来说似乎不那么自然。但是,始终可以转换数据或比例。转换比例会给您一个明智的传说。
哈德利2011年

@哈德利,好吧,既然我发现我同意这个trans论点scale\_gradient。“自然”一开始也可能是一个较差的词选择,我想我一直在寻找“语法上简单”的东西,并且误以为(现在被接受的)答案会更复杂。这就是我不阅读帮助文件中的所有示例所得到的!
格雷戈尔·托马斯

1
@LingZhang正如@kohske在他的回答中所写,现在可以将其存档,ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + stat_summary_hex(function(z){log(sum(z))})希望对大家有所 帮助
bluefish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.