Подтвердить что ты не робот

Почему я получаю "position_dodge требуется постоянная ширина", хотя ширины являются постоянными в ggplot2

Я получаю предупреждение, которое я не понимаю для простых гистограмм в ggplot2

> df <- data.frame(X = 127:131, Y = rnorm(5))
> df
    X          Y
1 127  0.9391077
2 128 -0.9392529
3 129 -1.1296221
4 130  1.1454907
5 131  1.8564596
> ggplot(df) + geom_bar(aes(X,Y), stat ="identity", position = "dodge")
Warning message:
position_dodge requires constant width: output may be incorrect 

Кажется, что это происходит только для определенных диапазонов значений X. Я искал информацию об этом, но все это, похоже, говорит о случаях, когда ширина действительно отличается, или случаи, когда stat не является "личностью". В этом случае значения X являются целыми числами, поэтому они должны быть простыми.

Созданная диаграмма выглядит нормально, поэтому мне неловко просто игнорировать предупреждение, которое я не понимаю.

Любая идея, что происходит?

4b9b3361

Ответ 1

Настройка options(warn = 2, error = recover) и повторное использование кода позволяет нам найти проблему.

Внутри функции collide (номер 16 в стеке вызовов) есть эта часть кода:

if (!zero_range(range(widths))) {
    warning(name, " requires constant width: output may be incorrect", 
        call. = FALSE)
}

Ошибки округления с плавающей запятой означают, что widths принимает несколько разные значения.

format(widths, digits = 22)
# [1] "0.9000000000000056843419" "0.8999999999999914734872" "0.8999999999999772626325"

Допуск для проверки того, что числа одинаковые, слишком строгие: около 2.2e-14.

args(zero_range)
# function (x, tol = .Machine$double.eps * 100) 
# NULL
.Machine$double.eps * 100
# [1] 2.220446e-14

Таким образом, предупреждение ошибочно; не беспокойтесь об этом.