Почему geom_histogram начинается с отрицательного нижнего предела бина, даже если все значения> 0? - PullRequest
4 голосов
/ 25 мая 2020

Я пробую набор данных бриллиантов в книге R Х. Уикхема. В geom_histogram по умолчанию для алмазов, где x = карат, ширина ячейки равна 0,5, но ячейка 1 начинается с -0,25, хотя самое низкое значение для карата равно 0,2. Почему это могло быть так? Прикрепляем pi c и код для контекста. Может ли кто-нибудь помочь объяснить. Спасибо.

##geom_histogram
geom_histogram(mapping=aes(x = carat),binwidth = 0.5)

summary(diamonds)
##dplyr to get count of cut[![enter image description here][1]][1]
diamonds %>%
count(cut_width(carat,0.5))

enter image description here

enter image description here

enter image description here

Ответы [ 3 ]

5 голосов
/ 25 мая 2020

Это помогает?

В p1 первая ячейка центрируется на 0. Но вы хотите, чтобы левая сторона ячейки начиналась с 0 - p2. Итак, вы должны сказать ggplot сдвинуть мусорные ведра. Вы можете сделать это с помощью аргумента boundary или center, которые обсуждаются в документации.

library(ggplot2)
library(patchwork)

##geom_histogram

p1 <- 
  ggplot(diamonds)+
  geom_histogram(mapping=aes(x = carat), binwidth = 0.5)+
  ggtitle("p1 bars centred on bin boundaries")


p2 <- 
  ggplot(diamonds)+
  geom_histogram(mapping=aes(x = carat), binwidth = 0.5, boundary = 0)+
  ggtitle("p2 bars between bin boundaries")




p1+p2

Created on 2020-05-25 by the пакет репекс (v0.3.0)

4 голосов
/ 25 мая 2020

cut_width ничего не знает о физическом l aws Вселенной, поэтому не знает, что carat должно быть положительным. Посмотрим, почему он это делает. Сейчас я нахожусь на ggplot2-3.2.1, поэтому некоторые строки могли быть обновлены в более новых версиях.

debugonce(cut_width)
cut_width(diamonds$carat, 0.5)
# debug: {
#     x <- as.numeric(x)
#     width <- as.numeric(width)
# ...truncated...

Шагайте вниз, пока не будет определено большинство вспомогательных переменных, затем

x_range
# [1] 0.20 5.01
boundary
# [1] 0.25
c(min_x, max_x)
# [1] -0.25  5.51
breaks
#  [1] -0.25  0.25  0.75  1.25  1.75  2.25  2.75  3.25  3.75  4.25  4.75  5.25

Важно что мы знаем, что диапазон данных составляет от 0,2 до 5,01 (x_range), boundary - это половина width (по коду), а min_x определяется другой вспомогательной функцией find_origin. Почему эта функция считает, что -0,25 - разумное начало первого бункера? Код не очень понятен по этому поводу (я бы спросил авторов).

Если вы хотите его контролировать, добавьте boundary=:

levels(cut_width(diamonds$carat, 0.5))
#  [1] "[-0.25,0.25]" "(0.25,0.75]"  "(0.75,1.25]"  "(1.25,1.75]"  "(1.75,2.25]"  "(2.25,2.75]"  "(2.75,3.25]"  "(3.25,3.75]" 
#  [9] "(3.75,4.25]"  "(4.25,4.75]"  "(4.75,5.25]" 
levels(cut_width(diamonds$carat, 0.5, boundary=0))
#  [1] "[0,0.5]" "(0.5,1]" "(1,1.5]" "(1.5,2]" "(2,2.5]" "(2.5,3]" "(3,3.5]" "(3.5,4]" "(4,4.5]" "(4.5,5]" "(5,5.5]"
0 голосов
/ 25 мая 2020

Вы можете определить границы гистограммы вручную с помощью seq.

library(ggplot2)
library(dplyr)

data("diamonds")

brks <- unique(seq(0, ceiling(max(diamonds$carat)), by = 0.5))

diamonds %>%
  mutate(bin = cut_width(carat, width = 0.5, breaks = brks, boundary = TRUE)) %>%
  count(bin)
## A tibble: 10 x 2
#   bin       n
#   <fct> <int>
# 1 0     18932
# 2 0.5   17506
# 3 1     12060
# 4 1.5    3553
# 5 2      1763
# 6 2.5      94
# 7 3        23
# 8 3.5       4
# 9 4         4
#10 5         1

ggplot(diamonds) +
  geom_histogram(mapping=aes(x = carat), binwidth = 0.5, breaks = brks)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...