R - ggplot geom_histogram отбрасывает значения - PullRequest
0 голосов
/ 01 октября 2019

Я строю полярную гистограмму в ggplot, но натолкнулся на проблему: я не могу представить, что оба графика строят столбцы так, чтобы они были выровнены по центру с соответствующими галочками, и не позволили ggplot сбросить какие-либомоих значений.

Этот снимок экрана иллюстрирует проблему.

Воспроизводимый пример:

library(ggplot2)
data <- data.frame(b = c(0:360))
ggplot(data, aes(x = b)) +
  geom_histogram(binwidth = 10, fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(0, 360)) +
  coord_polar(start = 0) 

Я получаю это сообщение, и столбик на 360° отсутствует:

Warning message:
Removed 2 rows containing missing values (geom_bar). 

Если добавить граничный ввод, появятся все столбцы и значения не будут удалены. Однако теперь столбцы выровнены по левому краю относительно их отметок, а не по центру.

ggplot(data, aes(x = b)) +
  geom_histogram(binwidth = 10, boundary = 0, fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(0, 360)) +
  coord_polar(start = 0) 

В конечном счете, как я могу гарантировать, что столбцы остаются выровненными по центру, а не по левому краю, не опуская никаких значений?

1 Ответ

0 голосов
/ 01 октября 2019

Это заняло немного возни. Любопытно, если я упускаю некоторые опции ggplot, чтобы упростить это.

Во-первых, похоже, что вы хотите, чтобы b == 0:9 и b == 360 были в ячейке "0". geom_histogram хочет нарисовать те, которые центрированы в 5, поэтому, чтобы этот бин был центрирован в 0, один из вариантов - вручную сдвинуть значения на 5. (См. data$c ниже.)

Затем,Я хотел убедиться, что новые данные от -5 до +4 были объединены в нулевую группу, поэтому я переключил closed = "left".

Затем, чтобы отобразить нулевую ячейку, нам действительно нужно x, чтобы вернуться к -5, так как ggplot проверяет, находится ли его полная ширина в области графика.

В этот момент он смотрит вправо, кроме вращения. Левый край первого мусорного ведра находится в 12 часов. Чтобы выровнять его центр, нам нужно сместить все это на -pi/36.

data <- data.frame(b = c(0:360))
data$c <- (data$b %% 360) - 5
ggplot(data, aes(x = c)) +
  geom_histogram(binwidth = 10, boundary = 5, fill = 'grey', color = 'black', 
                 closed = "left") +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(-5, 355)) +
  coord_polar(start = -pi/36) 

enter image description here

Альтернативное решение

Если вы не знакомы с geom_histogram, я обнаружил, что проще сначала выполнить суммирование и переключиться на geom_col:

sum_data <- data %>% dplyr::count(grp = (floor(b/10)*10) %% 360)
ggplot(sum_data, aes(grp, n)) +
  geom_col(fill = 'grey', color = 'black') +
  scale_x_continuous(breaks=seq(0, 270, by=90), limits = c(-5, 355)) +
  coord_polar(start = -pi/36)

enter image description here

...