gplot2网格重叠超出边界

时间:2018-11-04 18:18:35

标签: r ggplot2 r-grid

我在[0,1]中均匀创建点,每个点都有观察值。但是ggpolot显示了一些超出边界的大于1的观测值。即使坐标在0到1范围内,怎么会发生这种情况?您知道如何避免这种情况吗?

x=runif(10^6)
y=runif(10^6)
z=rnorm(10^6)

new.data=data.frame(x,y,z)

library(ggplot2)

ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z))

enter image description here

2 个答案:

答案 0 :(得分:3)

这是与用于分箱的网格有关的问题。 让我们使用一个较小的示例。

set.seed(42)
x=runif(10^3)
y=runif(10^3)
z=rnorm(10^3)

new.data=data.frame(x,y,z)

library(ggplot2)

(g <- ggplot(data=new.data) + 
    stat_summary_2d(fun = mean, aes(x=x, y=y, z=z))  +
    geom_point(aes(x, y)))

现在让我们放大左上角的那个框

g + coord_cartesian(xlim = c(0.02, 0.075), ylim = c(0.99, 1.035), 
                    expand = FALSE)

如您所见,该框开始于y = 1以下,但延伸至该值以上 因为您要根据某些binwidth对观测值进行分箱。 如果使用直方图,也会发生相同的现象。

ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
  geom_histogram()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

geom_histogram中,可以通过设置boundary参数来废除 设为0,并将垃圾箱数量设为总长度的倍数。

ggplot(data.frame(x = runif(1000, 0, 1)), aes(x)) +
  geom_histogram(boundary = 0, binwidth = 0.1)

所以您的解决方案是将binwidth设置为1 / n,其中n为 整数

ggplot(data=new.data) + 
    stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), binwidth = 0.1)  +
    geom_point(aes(x, y))

reprex package(v0.2.1.9000)于2018-11-04创建

答案 1 :(得分:1)

您有:

set.seed(1)
x=runif(10^6)

这是going on后面的the scenes

bins <- 30L
range <- range(x)
origin <- 0L
binwidth <- diff(range)/bins
breaks <- seq(origin, range[2] + binwidth, binwidth)
bins <- cut(x, breaks, include.lowest = TRUE, right = TRUE, dig.lab = 7)
table(bins)
# ...
# (0.8999984,0.9333317]   (0.9333317,0.9666649]   (0.9666649,0.9999982] 
# 33217                   33039                   33297 
# (0.9999982,1.033331] 
# 1 
max(x)
# [1] 0.9999984
  

即使坐标在0和1之内,这怎么可能发生   范围

  1. 装箱始于0(不是最小值)
  2. 每个垃圾箱的大小为binwidth
  3. 最后一个bin的最大值为binwidth,并获得最大值
  

您知道如何避免这种情况吗?

一种方法是定义自己的休息时间:

ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), breaks = seq(0, 1, .1))