是否有内置的方法在ggplot2中进行对数色标?

Gre*_*gor 61 r ggplot2

以下是分箱密度图的示例:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

调整色标以便间隔是间隔的,但尝试一下会很不错

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))
Run Code Online (Sandbox Code Playgroud)

结果Error: Continuous variable () supplied to discrete scale_hue.似乎休息期待一个因素(可能是?)并考虑到分类变量而设计?

有一个没有内置的解决方法,我会发布作为答案,但我想我可能只是迷失在我的使用scale_fill_hue,我想知道是否有任何明显的我缺少.

Gre*_*gor 108

是! 有一个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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我的另一个答案最适合用于更复杂的数据功能.哈德利的评论鼓励我在底部的例子中找到这个答案?scale_gradient.

  • @Eduardo ......好吧问题也是我的.很高兴你发现它很有用! (3认同)

Gre*_*gor 19

另一种方法,使用自定义函数stat_summary_hex:

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + 
  stat_summary_hex(function(z){log(sum(z))})
Run Code Online (Sandbox Code Playgroud)

这是现在的一部分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")
Run Code Online (Sandbox Code Playgroud)

生成此图.

在此输入图像描述

  • 对我来说似乎不太自然.但总是可以转换数据或规模.改变规模将给你一个明智的传奇. (6认同)