首页 > 解决方案 > ggplot2 geom_histogram 的奇怪行为

问题描述

我遇到了一个奇怪的问题,geom_histogram通过绘制均匀分布可以很容易地看到它。

library(tidyverse)
u <- runif(10000)
ggplot(data = as_tibble(u), aes(x = value)) + geom_histogram()

生成以下计数直方图: 在此处输入图像描述

可以看出它相当不对称,我在某处读到这是因为最左边(和最右边)的 bin 以 0 为中心,并且没有从 -0.5 到 0 生成任何值,从而产生了所见的差异。所以我摆弄了boundary参数,它让我:

ggplot(data = as_tibble(u), aes(x = value)) + geom_histogram(boundary = 0)

在此处输入图像描述

同样的设置boundary = 1使它在左侧不对称。

我的问题是:解决此行为的首选方法是什么?另外,这个论点究竟做了什么boundary?从文档中不是很清楚。

谢谢你。

标签: rggplot2plot

解决方案


据我所知,boundary指定一个作为两个垃圾箱之间的分割点。其余的 bin 是根据 bin 的数量或提供的断点设置的。如果提供boundary的数据超出数据范围,则会根据文档进行一些巧妙的转换。也许通过以下示例可以清楚地知道是什么boundary

解决方法

如果您为 x 轴设置限制,则可以规避该问题,尽管这不是一个非常优雅的解决方案。

library(tidyverse)
#> Warning: package 'ggplot2' was built under R version 4.1.0
set.seed(123)
u <- runif(1000)

p1 <- ggplot(data = as_tibble(u), aes(x = value)) + geom_histogram(boundary = 0)
p2 <- ggplot(data = as_tibble(u), aes(x = value)) + geom_histogram(boundary = 0) + 
  scale_x_continuous(limits = c(0, 1)) 

cowplot::plot_grid(p1, p2, nrow = 2)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

边界示例

在第三个图 (p3) 中,boundary设置为 0.5,您可以看到两个 bin 在 0.5 处精确拆分。在 0.75 点处的第四个图也是如此。Boundary 可能不是它所做工作的最佳名称,但基本上指出给定数字应该是两个 bin 之间的边界。


u <- runif(10)
p3 <- ggplot(data = as_tibble(u), aes(x = value)) + 
  geom_histogram(bins = 22, boundary = .5, binwidth = 0.1) +
  scale_x_continuous(limits = c(0, 1))

p4 <- ggplot(data = as_tibble(u), aes(x = value)) + 
  geom_histogram(bins = 22, boundary = .75, binwidth = 0.1) + 
  scale_x_continuous(limits = c(0, 1))


cowplot::plot_grid(p3, p4, nrow = 2)
#> Warning: Removed 2 rows containing missing values (geom_bar).

reprex 包于 2021-06-13 创建 (v2.0.0 )


推荐阅读