gpt4 book ai didi

r - geom_histogram : wrong bins?

转载 作者:行者123 更新时间:2023-12-04 18:03:24 26 4
gpt4 key购买 nike

我正在使用 ggplot 2.1.0 来绘制直方图,并且我有一个关于直方图箱的意外行为。
我在这里放了一个带有左封闭 bin(即 [ 0, 0.1 [ ),binwidth 为 0.1 的示例。

mydf <- data.frame(myvar=c(-1,-0.5,-0.4,-0.1,-0.1,0.05,0.1,0.1,0.25,0.5,1))
myplot <- ggplot(mydf, aes(myvar)) + geom_histogram(aes(y=..count..),binwidth = 0.1, boundary=0.1,closed="left")
myplot
ggplot_build(myplot)$data[[1]]

enter image description here

在这个例子中,人们可能期望值 -0.4 在 bin [-0.4, -0.3[ 内,但它反而(神秘地)落在 bin [-0.5,-0.4[.对于落在 [-0.2,-0.1[ 而不是 [-0.1,0[... 等] 中的值 -0.1 也是如此。

这里有什么我不完全理解的东西(尤其是新的“中心”和“边界”参数)?或者 ggplot2 在那里做奇怪的事情?

提前致谢,
此致,
阿诺

PS:这里也问: https://github.com/hadley/ggplot2/issues/1651

最佳答案

编辑:以下描述的问题已在 ggplot2 的最新版本中得到修复。 .

正如 Roland 的评论中所建议的那样,您的问题是可重现的,并且似乎是由舍入错误引起的。在这一点上,这在我看来就像版本 ggplot2_2.0.0 中引入的错误。 .我在下面推测它的起源,但首先让我提出一个基于 boundary 的解决方法。选项。

问题 :

df <- data.frame(var = seq(-100,100,10)/100)
as.list(df) # check the data
$var
[1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2
[10] -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
[19] 0.8 0.9 1.0
library("ggplot2")
p <- ggplot(data = df, aes(x = var)) +
geom_histogram(aes(y = ..count..),
binwidth = 0.1,
boundary = 0.1,
closed = "left")
p

enter image description here

解决方案

调整 boundary参数 .在这个例子中,设置略低于 1,比如 0.99,有效。您的用例也应该可以进行调整。
ggplot(data = df, aes(x = var)) + 
geom_histogram(aes(y = ..count..),
binwidth = 0.05,
boundary = 0.99,
closed = "left")

(为了更好的视觉效果,我使 binwidth 变窄了)

enter image description here

另一种解决方法是引入您自己的模糊性,例如将数据乘以 1 加上略小于机器零(参见下面的 eps)。在 ggplot2模糊度乘以 1e-7(早期版本)或 1e-8(后期版本)。

原因:
ncount中问题明显:
str(ggplot_build(p)$data[[1]])
## 'data.frame': 20 obs. of 17 variables:
## $ y : num 1 1 1 1 1 2 1 1 1 0 ...
## $ count : num 1 1 1 1 1 2 1 1 1 0 ...
## $ x : num -0.95 -0.85 -0.75 -0.65 -0.55 -0.45 -0.35 -0.25 -0.15 -0.05 ...
## $ xmin : num -1 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 ...
## $ xmax : num -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0 ...
## $ density : num 0.476 0.476 0.476 0.476 0.476 ...
## $ ncount : num 0.5 0.5 0.5 0.5 0.5 1 0.5 0.5 0.5 0 ...
## $ ndensity: num 1.05 1.05 1.05 1.05 1.05 2.1 1.05 1.05 1.05 0 ...
## $ PANEL : int 1 1 1 1 1 1 1 1 1 1 ...
## $ group : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ ymin : num 0 0 0 0 0 0 0 0 0 0 ...
## $ ymax : num 1 1 1 1 1 2 1 1 1 0 ...
## $ colour : logi NA NA NA NA NA NA ...
## $ fill : chr "grey35" "grey35" "grey35" "grey35" ...
## $ size : num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
## $ linetype: num 1 1 1 1 1 1 1 1 1 1 ...
## $ alpha : logi NA NA NA NA NA NA ...

ggplot_build(p)$data[[1]]$ncount
## [1] 0.5 0.5 0.5 0.5 0.5 1.0 0.5 0.5 0.5 0.0 1.0 0.5
## [13] 0.5 0.5 0.0 1.0 0.5 0.0 1.0 0.5

舍入错误?

好像:
    df <- data.frame(var = as.integer(seq(-100,100,10)))
# eps <- 1.000000000000001 # on my system
eps <- 1+10*.Machine$double.eps
p <- ggplot(data = df, aes(x = eps*var/100)) +
geom_histogram(aes(y = ..count..),
binwidth = 0.05,
closed = "left")
p

(我已经完全删除了 boundary 选项)

enter image description here

此行为在 ggplot2_1.0.1 一段时间后出现.查看源代码,例如 bin.Rstat-bin.rhttps://github.com/hadley/ggplot2/blob/master/R ,并跟踪 count 的计算导致功能 bin_vector() ,其中包含以下几行:
bin_vector <- function(x, bins, weight = NULL, pad = FALSE) {
... STUFF HERE I HAVE DELETED FOR CLARITY ...
cut(x, bins$breaks, right = bins$right_closed,
include.lowest = TRUE)
... STUFF HERE I HAVE DELETED FOR CLARITY ...
}

通过将这些函数的当前版本与旧版本进行比较,您应该能够找到不同行为的原因……有待继续……

总结调试

来自 "patching" bin_vector函数并将输出打印到屏幕上,看起来:
  • bins$fuzzy正确存储模糊参数
  • 非模糊 bins$breaks用于计算,但据我所知(如果我错了,请纠正我)bins$fuzzy不是。
  • 如果我简单地替换 bins$breaksbins$fuzzy顶部 bin_vector ,返回正确的图。不是一个错误的证明,而是一个建议,也许可以做更多的事情来模拟 ggplot2 以前版本的行为。 .
  • 置顶 bin_vector我希望找到一个条件来返回 bins$breaksbins$fuzzy .我认为现在缺少了。

  • 修补

    "patch" bin_vector函数,从 github 源复制函数定义,或者更方便的是,从终端复制函数定义,使用:
     ggplot2:::bin_vector

    修改(打补丁)并将其分配到命名空间中:
    library("ggplot2")
    bin_vector <- function (x, bins, weight = NULL, pad = FALSE)
    {
    ... STUFF HERE I HAVE DELETED FOR CLARITY ...
    ## MY PATCH: Replace bins$breaks with bins$fuzzy
    bin_idx <- cut(x, bins$fuzzy, right = bins$right_closed,
    include.lowest = TRUE)
    ... STUFF HERE I HAVE DELETED FOR CLARITY ...
    ggplot2:::bin_out(bin_count, bin_x, bin_widths)
    ## THIS IS THE PATCHED FUNCTION
    }
    assignInNamespace("bin_vector", bin_vector, ns = "ggplot2")
    df <- data.frame(var = seq(-100,100,10)/100)
    ggplot(data = df, aes(x = var)) + geom_histogram(aes(y = ..count..), binwidth = 0.05, boundary = 1, closed = "left")

    为了清楚起见,为了清晰起见,对上面的代码进行了编辑:该函数有很多类型检查和其他计算,我已将其删除,但您需要修补该函数。在运行补丁之前,重新启动 R session 或 detach您当前加载的 ggplot2 .

    旧版本

    意外行为是 不是 在版本中观察到 2.0.9.32.1.0.1并且似乎源自当前版本 2.2.0.1 (或者可能是更早的 2.2.0.0 ,当我尝试调用它时给了我一个错误)。

    要安装和加载旧版本,请说 ggplot2_0.9.3 , 创建一个单独的目录(覆盖当前版本没有意义),比如 ggplot2093 :
    URL <- "http://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_0.9.3.tar.gz" 
    install.packages(URL, repos = NULL, type = "source",
    lib = "~/R/testing/ggplot2093")

    要加载旧版本,请从本地目录调用它:
    library("ggplot2", lib.loc = "~/R/testing/ggplot2093") 

    关于r - geom_histogram : wrong bins?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876096/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com