Совместите левую границу столбца geom_col с привязкой данных - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь нанести некоторые метки времени с помощью ggplot2 и R. Вот минимальный и воспроизводимый пример моей текущей работы

library(lubridate)
library(ggplot2)

sample_size <- 100

start_date = as.POSIXct("2020-01-01 00:00")
end_date = as.POSIXct("2020-01-02 00:00")

timestamps <- as.POSIXct(sample(seq(start_date, end_date, by=60), sample_size))
amount <- rpois(sample_size, 5)

df <- data.frame(timestamps=timestamps, amount=amount)

df$hour_group <- floor_date(df$timestamps, unit="1 hour")
ggplot(df, aes(x=hour_group, y=amount)) + geom_col()

Объяснение: Сначала создается образец кадра данных со столбцом отметка времени и сумма . Временные метки равномерно выбираются между start_date и end_date. Я хотел бы построить переменную amount для каждого часа дня. Поэтому создается другой столбец hour_group, в котором указывается час каждой отметки времени.

При построении этих данных получается следующий график:

enter image description here

Столбцы выглядят хорошо, но, например, первый столбец представляет сумму из amount с отметками времени между 00:00 и 01:00 Я бы хотел, чтобы столбец заполнял именно это пространство (не 23:30 до 00:30, как на текущем графике). Поэтому я хочу, чтобы выровнять левую границу каждого столбца с точкой привязки (в примере 00:00), а не центрировать столбец в этой точке. Как этого достичь?

Мой подход: Один из способов, которым я могу думать, - это создать еще один столбец со смещенными опорными точками. В примере требуется 30-минутная смена.

df$hour_group_shifted <- df$hour_group + 60*30

Новый график создает ожидаемый результат

enter image description here

Мне все еще интересно, есть ли может быть проще сделать это напрямую с помощью настройки ggplot без дополнительного столбца.

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете использовать position_nudge.

ggplot(df, aes(x=hour_group, y=amount)) + 
  geom_col(position = position_nudge(60*30))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...