漂亮的日志刻度与ggplot hex plot

时间:2017-03-13 02:54:02

标签: r ggplot2 scope global

我想用ggplot绘制一个hexbin图,但是用log scale" pretty"打破频率。考虑

df = data.frame(a=rnorm(1000)); df$b <- df$a+rnorm(1000);

我使用this answer在线性比例上获得了很好的休息

ggplot(df, aes(a,b)) +
  geom_hex(aes(fill=cut(..value..,breaks=pretty(..value.., n=10)))) +
  scale_fill_discrete("Frequency")

这很有效。现在说我想使用log scale相当休息。所以我使用another answer中的想法来定义

base_breaks <- function(n = 10){
    function(x) {
        axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
    }
}

并尝试做

ggplot(df, aes(a,b)) + 
  geom_hex(aes(fill=cut(..value..,breaks=base_breaks(n=10)(..value..))))

但无法找到该功能。它说:

Error in cut.default(value, breaks = base_breaks(n = 10)(value)) : 
  could not find function "base_breaks"

即使定义了base_breaks。

> base_breaks(n=10)(c(1:1000))
[1]    1    5   10   50  100  500 1000

如何在ggplot调用它的任何环境中使我的函数可见?我甚至用

将其定义为全局变量
base_breaks <<- function(n = 10){
    function(x) {
        axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
    }
}

但我仍然得到同样的错误。

1 个答案:

答案 0 :(得分:0)

我不确定,但您可以尝试简化这样的功能:

base_breaks <<- function(n = 10, x){
    axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
}

也许问题是你有一个函数,其结果是另一个函数,这可能导致错误。有了这个方法,您可以更直接地获得这些值。看看吧!

我自己无法检查,因为我收到错误object 'value' not found ...