Сетки gplot2 перекрывают границы - PullRequest
0 голосов
/ 04 ноября 2018

Я создаю точки равномерно в [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 голосов
/ 04 ноября 2018

У вас есть:

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

Вот что происходит за сценами :

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. есть окончательный лоток, который заканчивается максимальным значением + binwidth, который получает максимальное значение

У вас есть идеи, как этого избежать?

Один из способов - определить свои собственные перерывы:

ggplot(data=new.data) + stat_summary_2d(fun = mean, aes(x=x, y=y, z=z), breaks = seq(0, 1, .1))
0 голосов
/ 04 ноября 2018

Это проблема, связанная с сеткой, используемой для биннинга. Давайте использовать маленький пример.

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, но расширяется выше этого значения. потому что вы складываете наблюдения в соответствии с некоторой пропускной способностью. Такое же явление может произойти, если вы используете гистограмму.

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))

Создано в 2018-11-04 пакетом представ. (v0.2.1.9000)

...