我想用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)
}
}
但我仍然得到同样的错误。
答案 0 :(得分:0)
我不确定,但您可以尝试简化这样的功能:
base_breaks <<- function(n = 10, x){
axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n)
}
也许问题是你有一个函数,其结果是另一个函数,这可能导致错误。有了这个方法,您可以更直接地获得这些值。看看吧!
我自己无法检查,因为我收到错误object 'value' not found
...